概述:数塔问题,求所能走的数字的最大和。
思路:上课讲过的问题,可以从上向下,也可以从下向上,我用的从上向下,状态转移方程:dp[i][j]=data[i][j]+max(dp[i-1][j],dp[i-1][j-1]);
感想:无。
<span style="font-size:14px;">#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
int data[1005][1005];
int dp[1005][1005];
int main()
{
int n,c,i,j;
while(scanf("%d",&c)!=EOF)
{
while(c--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
{
scanf("%d",&data[i][j]);
}
dp[1][1]=data[1][1];
for( i=2;i<=n;i++)
for( j=1;j<=i;j++)
{
dp[i][j]=data[i][j]+max(dp[i-1][j],dp[i-1][j-1]);
}
int maxn=0;
for(int j=1;j<=n;j++)
maxn=max(maxn,dp[n][j]);
printf("%d\n",maxn);
}
}
return 0;
}</span>