/*
input:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
output:
30
数字三角形,可以说是一道很经典的题了,这道题应该出现在dp的入门题里,
但是在这里提前介绍也是有原因的,因为递推中同样涉及了这个关系式的推导,
好了,来仔细研究下这个三角形吧,总之这个三角形很重要,思想和方法一定要
领会,在后面的很多题目中,都是这种类型题目的变形。
要输出的是从三角形的顶部到最后一行的所有数字的和的问题,关于这个问题
我想在小学奥数中肯定接触过诸如此类类似的题目,当时大家是怎么解决?QAQ,忘了
忘了,肯定是草稿上乱撸一片,然后就出来了一个看似正确的结果,再将其放进去了
TAT,这样的学习是错误的,学习就应该抓本质和抓概念,而不能抓作业和抓考试,
否则到头来,啥东西也没学会。。。。。
先看看这个题吧,我们采用倒推的手段来处理这个题目,首先,我们假设a[i][j]中
存放的是我们需要的数值,也就是说,a[i][j]表示的是从第一行到第i行的最优的
那条路线和,但是,我们却要用a[i+1][j+1]来表示题目中的的最后一行。
然后由a[i][j]+=max{a[i+1][j],a[i+1][j+1]}从结果行到第一行一次递归运算就行了,
最后输出a[1][1]就是我们需要的结果了。因为,a[i][j]存放的是才第i行到i+1行的
最优路线和,而a[i-1][j-1]存放的确实第i-1行到第i+1行的最优路线和,一次一次的
往前推,认真想,肯定是能想会的,那么a[1][1]就是我们需要的最优路线和了。
*/
# include<cstdio>
# include<iostream>
# include<cstring>
using namespace std;
int a[123][123];
int main(void)
{
memset(a,0,sizeof(a));
int n;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++ )
{
if ( a[i+1][j] > a[i+1][j+1] )
a[i][j]+=a[i+1][j];
else
a[i][j]+=a[i+1][j+1];
}
}
cout<<a[1][1]<<endl;
return 0;
}
实验室这几天没流量了,不知道是哪个片帝在用P2P下片,导致我写了好多东西都没办法上传,也刷不了题了QAQ,,,,
递推 数字三角形
最新推荐文章于 2022-02-08 18:47:51 发布