题目链接
思路
经典的数塔题,直接从上往下递推就行了。。。
代码
# include <bits/stdc++.h>
using namespace std;
# define db double
# define ll long long
# define sc scanf
# define pr printf
# define fi first
# define se second
# define pb push_back
# define m_p make_pair
# define Pir pair< int , int >
# define inf 0x3f3f3f3f
# define INF 0x3f3f3f3f3f3f3f3f
const int N = 205 ;
ll a[ N] [ N] , dp[ N] [ N] ;
int main ( )
{
int T, cas = 1 ; sc ( "%d" , & T) ;
while ( T -- )
{
int n; sc ( "%d" , & n) ;
for ( int i = 1 ; i <= 2 * n - 1 ; i ++ )
{
if ( i <= n)
{
for ( int j = 1 ; j <= i; j ++ )
{
sc ( "%lld" , & a[ i] [ j] ) ;
}
}
else
{
for ( int j = 1 ; j <= 2 * n - i; j ++ )
{
sc ( "%lld" , & a[ i] [ j] ) ;
}
}
}
memset ( dp, 0 , sizeof dp) ;
dp[ 1 ] [ 1 ] = a[ 1 ] [ 1 ] ;
for ( int i = 1 ; i < n; i ++ )
{
for ( int j = 1 ; j <= i; j ++ )
{
dp[ i + 1 ] [ j] = max ( dp[ i + 1 ] [ j] , dp[ i] [ j] + a[ i + 1 ] [ j] ) ;
dp[ i + 1 ] [ j + 1 ] = max ( dp[ i + 1 ] [ j + 1 ] , dp[ i] [ j] + a[ i + 1 ] [ j + 1 ] ) ;
}
}
for ( int i = n; i < 2 * n - 1 ; i ++ )
{
for ( int j = 1 ; j <= 2 * n - i; j ++ )
{
dp[ i + 1 ] [ j] = max ( dp[ i + 1 ] [ j] , dp[ i] [ j] + a[ i + 1 ] [ j] ) ;
dp[ i + 1 ] [ j - 1 ] = max ( dp[ i + 1 ] [ j - 1 ] , dp[ i] [ j] + a[ i + 1 ] [ j - 1 ] ) ;
}
}
pr ( "Case %d: %lld\n" , cas ++ , dp[ 2 * n - 1 ] [ 1 ] ) ;
}
return 0 ;
}