LightOJ-1004-Monkey Banana Problem [DP]


题目传送门


题意:给定一个菱形的阵列,每次只能向左下或者右下移动,问从最上边走到最下边数字之和最大为多大。

思路: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;
}
发布了101 篇原创文章 · 获赞 1 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章