简单的经典DP数塔 给你类似下面的塔型数组,让你选一条路径使路上的节点数之和最大;
从下往上面分析,在倒数第二排可以见,每个数下面只接了两个数,也就是说要往上面走到2,必须从下面两条路选,则选择最大的那个值,以此类推往上走,使最上面的值最大;
转移方程 F[i][j]=max{F[i+1][j],F[i+1][j+1]}+F[i][j];
#include<stdio.h>
#include<string.h>
int main()
{
int T,n,i,j; //F[i][j]=max{F[i+1][j],F[i+1][j+1]}+F[i][j];
int num[200][200];
scanf("%d",&T);
while(T--)
{
memset(num,0,sizeof(num));
scanf("%d",&n);
for(i=1;i<=n;i++)
{
for(j=1;j<=i;j++)
{
scanf("%d",&num[i][j]);
}
}
for(i=n;i>=1;i--)
{
for(j=1;j<=i;j++)
{
if(num[i+1][j]>num[i+1][j+1])
num[i][j]=num[i+1][j]+num[i][j];
else
num[i][j]=num[i+1][j+1]+num[i][j];
}
}
printf("%d\n",num[1][1]);
}
return 0;
}