数字三角形

 今天,我们学习了简单的DP,果然,大佬们的世界都是复杂的,听何大佬在上面讲了1天,还有点云里雾里的,然后,好不容易的AC掉了一道题——数字三角形。

   数字三角形:

  题目描述:说白了就是写一个程序查找从最高点到底部的路径,并保证经过的数字和最大。注:每一步都只能走到左下方的点或右下方的点。

     输入格式

 第一个行包含 R(1<= R<=1000) ,表示行的数目。后面每行为这个数字金字塔特定行包含的整数。所有的被供应的整数是非负的且不大于100。

     输出格式

      单独的一行,包含那个可能得到的最大的和。

样例数据

input

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

output

30


主要思路:首先要做的就是把这个三角形用数组存储下来,变成我们方便处理的方式,如:(下图中的右)

                     

于是两种走的形式:左下方变成正下方(a[i][j]→a[i+1][j]),而右下方走不变(a[i][j]→a[i+1][j+1]).其实这道题有两种方法可以做,但我搜索还没学好,就本本分分的用了递推。我们可以把这个三角形一行一行的分成很多阶段,令f[i,j]为第i行第j列上点到最后一行的最大和。我们又有两种方法来递推出答案----逆推和顺推,逆推以前没用过,所以这次尝试了下:方程为f[i,j]=max(f[i+1,j],f[i+1,j+1])+a[i,j],最后结果为f[1,1]。

代码如下:

#include
using namespace std;
int n,a[1010][1010];
int main()
{
    cin>>n;
	for(int i=1;i<=n;i++)
	 for(int j=1;j<=i;j++)
	  cin>>a[i][j];//读入三角形
	for(int i=n-1;i>=1;i--)
	 for(int j=1;j<=i;j++)
	  a[i][j]+=max(a[i+1][j],a[i+1][j+1]);//代入方程逆推
	cout<<a[1][1]<<endl;
	return 0;
}
注意:千万看重细节,数组最好开在外面,否则可能会无法运行,我可是亲身体验过的(重打了三遍还不对)

别看这题不是很难,难的在下面呢!!!!

你可能感兴趣的:(数字三角形)