递归分析:d[i][j]=max{d[i+1][j]+v[i+1][j],d[[i+1][j+1]+v[i+1][j+]}//这里已经不是单线程的问题了,所以要用二维坐标表示。所以上从上层节点反回溯到下层节点。
递推分析:自下而上。
初始化:最底层的节点信息
最优子结构:树的每一个节点都是d[i][j]当前最大路径
代码:
#include<iostream> #include<string.h> #define maxn 1000+5 using namespace std; int map[maxn][maxn]; int dp[maxn][maxn]; int main(){ int n;//这是一个n*n的数塔 cin>>n; for(int i=1;i<=n;i++){ for(int j=1;j<=i;j++){ cin>>map[i][j]; } } for(int i=1;i<=n;i++)d[n][i]=map[n][i];//初始化哦 for(int i=n-1;i>=1;i++){ for(int j=1;j<=i;j++){ dp[i][j]=max(dp[i+1][j]+map[i][j],dp[i+1][j+1]+map[i][j]); //这里区别于一般的多通道(选择)的原因是下层只有两个节点,不然,就有三重循环了 } } cout<<d[1][1]; return 0; }