题意:给定一个菱形的阵列,每次只能向左下或者右下移动,问从最上边走到最下边数字之和最大为多大。
思路:DP,可以分解成两个数塔。
#include <bits/stdc++.h>
using namespace std;
int dp[210][210];
int main(void)
{
int T, N, cas=1;
scanf("%d", &T);
while (T--)
{
memset(dp, 0, sizeof(dp));
scanf("%d", &N);
for (int i = 1; i <= N; i++)
for (int j = 1; j <= i; j++)
scanf("%d", &dp[i][j]);
for (int i = N+1; i <= 2*N-1; i++)
for (int j = 1; j <= 2*N-i; j++)
scanf("%d", &dp[i][j]);
for (int i = 2; i <= N; i++)
for (int j = 1; j <= i; j++)
dp[i][j] += max(dp[i-1][j-1], dp[i-1][j]);
for (int i = N+1; i <= 2*N-1; i++)
for (int j = 1; j <= 2*N-i; j++)
dp[i][j] += max(dp[i-1][j], dp[i-1][j+1]);
printf("Case %d: %d\n", cas++, dp[2*N-1][1]);
}
return 0;
}