题目大意:给你N个格子,每个格子有相应的数字,现在要求你从最上面往下走,走到最下面。每次只能往左下或者右下走
问最后走到的格子的数的总和的最大值
解题思路:用dp[i][j]表示走到第i行第j列得到的最大和
因为规则,所以转移方程为dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + val[i][j]
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 210;
const int INF = 0x3f3f3f3f;
int num[N][N];
int dp[N][N];
int n, cas = 1;
void solve () {
scanf("%d", &n);
scanf("%d", &num[1][1]);
dp[1][1] = num[1][1];
for (int i = 2; i <= n; i++)
for (int j = 1; j <= i; j++) {
scanf("%d", &num[i][j]);
dp[i][j] = dp[i - 1][j] + num[i][j];
if (j - 1 >= 1) dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + num[i][j]);
}
for (int i = n + 1; i < 2 * n; i++)
for (int j = 1; j <= 2 * n - i; j++) {
scanf("%d", &num[i][j]);
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j + 1]) + num[i][j];
}
printf("Case %d: %d\n", cas++, dp[2 * n - 1][1]);
}
int main() {
int test;
scanf("%d", &test);
while (test--) solve();
return 0;
}