题意:树塔,从上往下走,只能向下,左下,右下走,求经过的数的最大值
思路:这是一个最简单的动态规划问题,和老师上课讲的金币那个差不多,只要层层递进就可以,从倒数第二行开始,它和它下面相邻的能取到最大值就是所求的最优解的一部分,然后保存起来,向上一层递进,最后到达第一层,此时所保存的数就是所求的最大值
源码:
#include <iostream>
#define MAX 100
using namespace std;
int main()
{
int k,i,C,n;
cin>>C;
for(k=0;k<C;k++)
{
cin >> n;
int a[MAX+1][MAX+1][3];
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= i; ++j)
{
cin >> a[i][j][0];
a[i][j][1] = a[i][j][0];
a[i][j][2] = 0;
}
}
for(int i = n-1; i >= 1; --i)
{
for(int j=1; j <= i; j++)
{
if (a[i+1][j][1] > a[i+1][j+1][1])
{
a[i][j][2] = 0;
a[i][j][1] += a[i+1][j][1];
}
else
{
a[i][j][2] = 1;
a[i][j][1] += a[i+1][j+1][1];
}
}
}
cout << a[1][1][1] << endl;
}
return 0;
}
Problem F
Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 23 Accepted Submission(s) : 16
1 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
30