数塔问题。
典型DP,状态转移方程:dp[i][j]=max(dp[i+1][j+1]+ans[i][j],dp[i+1][j]+ans[i][j]);其中,数组ans为数塔元素,dp最后一行初始化为数塔最后一行。
#include <cstdio>
#include <cstring>#include <iostream>
#define MAX 110
using namespace std;
int main()
{
int t,n;
int ans[MAX][MAX],dp[MAX][MAX];
cin>>t;
while(t--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
for(int j=0;j<=i;j++)
scanf("%d",&ans[i][j]);
for(int i=0;i<n;i++)
dp[n-1][i]=ans[n-1][i];
for(int i=n-2;i>=0;i--)
for(int j=0;j<=i;j++)
dp[i][j]=max(dp[i+1][j]+ans[i][j],dp[i+1][j+1]+ans[i][j]);
printf("%d\n",dp[0][0]);
}
return 0;
}