【动态规划】基础动态规划练习-数字三角形

原题出字洛谷

题目描述

观察下面的数字金字塔。
写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。

    7 
  3   8 
8   1   0 

2 7 4 4
4 5 2 6 5
在上面的样例中,从 7 \ 3 \ 8 \o 7 \ 57→3→8→7→5 的路径产生了最大

输入格式

第一个行一个正整数 rr ,表示行的数目。
后面每行为这个数字金字塔特定行包含的整数。

输出格式

单独的一行,包含那个可能得到的最大的和。
输入输出样例
输入 #1
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出 #1
30

代码:

#include
#include 
using namespace std;

int n;
int a[1001][1001];//用于输入数字金字塔 
int f[1001][1001];//记录到达f[i][j]的最大值 

int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=i;j++)
		  cin>>a[i][j];
	}
	//初始化边界,我采用的是倒推的方式 ,最后的输出值就是f[1][1] 
	//正着推也是可以的 
	for(int j=1;j<=n;j++)
	    f[n][j]=a[n][j];
	
	for(int i=n-1;i>=1;i--)
	for(int j=1;j<n;j++)
	{
		f[i][j]=max(f[i+1][j],f[i+1][j+1])+a[i][j];
	}
	cout<<f[1][1];
	
	return 0;
} 

你可能感兴趣的:(信息学竞赛CSP,J/S,C++)