#include <bits/stdc++.h>
using namespace std;
int a[200][200];
int bk[200][200];
int n,m;
int dfs(int x,int y){
if(x==n){//找到最下面一层,停止寻找
return bk[x][y]=a[x][y];
}
if(bk[x][y])//记忆化搜索,已经找到最大值的点不再向下找
return bk[x][y];
return bk[x][y]=a[x][y]+max(dfs(x+1,y),dfs(x+1,y+1));
}
void bfs(int x,int y){
if(x>n)//找完了
return;
cout<<y<<" ";//x行第y个数
if(bk[x+1][y]>bk[x+1][y+1])//最大值路径只会在最大值的下面和右下
bfs(x+1,y);
else
bfs(x+1,y+1);
return ;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
cin>>a[i][j];
cout<<"最大值:"<<endl;
cout<<dfs(1,1)<<endl;
cout<<"最大值路径:"<<bfs(1,1)<<endl;
return 0;
}
数塔问题(最大值路径)
最新推荐文章于 2022-04-08 14:16:25 发布