light oj 1004 - Monkey Banana Problem

来源:互联网 发布:java程序员接私活经验 编辑:程序博客网 时间:2024/04/28 00:35


2*n-1行的数字,每行选一个数字相加,最大的和是多少


数塔

n行之前 dp[i][j] = max(dp[i-1][j-1], dp[i-1][j]) + 数塔上的数; i行第j个

n行至后,dp[n+i][j] = max(dp[n+i-1][j], dp[n+i-1][j+1]) +  数塔上的数;






#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int dp[210][110];int main(){    int t,n;    int tmp,cnt;    cnt = 1;    scanf("%d", &t);    while(t--)    {        scanf("%d", &n);        scanf("%d", &dp[1][1]);        for(int i = 2; i <= n; i++)        {            scanf("%d", &tmp);            dp[i][1] = dp[i-1][1] + tmp;            for(int j = 2; j < i; j++)            {                scanf("%d", &tmp);                dp[i][j] = max(dp[i-1][j-1], dp[i-1][j]) + tmp;            }            scanf("%d", &tmp);            dp[i][i] = dp[i-1][i-1] + tmp;        }        for(int i = 1; i < n; i++)        {            for(int j = 1; j <= n-i; j++)            {                scanf("%d", &tmp);                dp[n+i][j] = max(dp[n+i-1][j], dp[n+i-1][j+1]) + tmp;            }        }        printf("Case %d: %d\n", cnt++, dp[2*n-1][1]);    }    return 0;}


0 0