递归分析: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;
}