动态规划学习记录 三、数塔问题

递归分析: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;
}
原文地址:https://www.cnblogs.com/little-w/p/3224889.html