題意:給定一個菱形的陣列,每次只能向左下或者右下移動,問從最上邊走到最下邊數字之和最大爲多大。
思路: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;
}