LightOJ - 1004 Monkey Banana Problem(DP)

来源:互联网 发布:mac协议 编辑:程序博客网 时间:2024/05/17 04:38

题目大意:给你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;}
0 0