这题是一水题,只需从第一层一直往下面找子树中较大的那一个就可以了,很快水了,不过用codeblocks编得郁闷,codeblocks上编译都过不了,直接提交就水了
#include<stdio.h>
int n,inf = 0x7fffffff,des[10000],num[10000];
int cal( int sum,int i,int j )
{
if( num[sum + j] == inf )
return 0;
if( des[sum + j] )
return num[sum + j];
des[sum + j] = 1;
if( j > i )
{
sum += i;
++i;
j = 1;
}
return num[sum + j] += ( cal(sum + i,i + 1, j) > cal(sum + i,i + 1,j + 1) ? cal(sum + i,i + 1, j) :cal(sum + i,i + 1,j + 1));
}
int main( )
{
int t;
scanf( "%d",&t );
while( t-- )
{
scanf( "%d",&n );
for( int i = 0; i <= 6000; ++i )
num[i] = inf,des[i] = 0;
for( int i = 1,sum = 0; i <= n; sum += i,++i )
for( int j = 1; j <= i; ++j )
scanf( "%d",&num[j+sum] );
int res = cal( 0,1,1 );
printf( "%d\n",res );
}
return 0;
}