题目:
1 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
30
题意:就是一个塔结构的数图,然后从第一行开始每行都取一个数,而且必须取自己下一行靠的最近的左边或右边其中一个,求取得这些数相加最大。。
思路:1
2 3
4 5 6
就以这个为例:2只能与4 5其中一个数相加,取最大的5与2相加,把得到的7赋给原来的2所在的位置,同理3->3+6=9,即变为了
1
7 9
然后取最大的9和1相加得到10即为所求。。
代码:
#include<iostream>
#include<cstdio>
using namespace std;
const int M=1005;
int f[M][M],a[M][M];
int max(int x,int y)
{
return x<y?y:x;
}
int main()
{
int d,i,j,n,r;
cin>>d;
for(r=1;r<=d;r++)
{
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
cin>>a[i][j];
for(j=1;j<=n;j++)
f[n][j]=a[n][j];
for(i=n-1;i>=1;i--)
for(j=1;j<=i;j++)
f[i][j]=a[i][j]+max(f[i+1][j],f[i+1][j+1]);
cout<<f[1][1]<<endl;
}
return 0;
}