F - Monkey Banana Problem

题目链接:http://acm.hust.edu.cn/vjudge/contest/121396#problem/F

题意:这个题与那个数组三角形的题差不多,只不过是多了一个倒三角而已;

分析:需要注意的是定义一个怎样的状态,根据这个状态写出状态转移方程

状态转移方程: dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+a[i][j] 上三角

                     dp[i][j]=max(dp[i-1][j],dp[i-1][j+1])+a[i][j] 下三角

AC代码:

#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int dp[1050][1050];
int a[1050][1050];
int main()
{
    int t,n,ans;;
    scanf("%d",&t);
    ans=1;
    while(t--)
    {
        scanf("%d",&n);
        memset(dp,0,sizeof(dp));
        memset(a,0,sizeof(a));
        for(int i=1; i<=n; i++)
            for(int j=1; j<=i; j++)
                scanf("%d",&a[i][j]);
        for(int i=n+1; i<2*n; i++)
            for(int j=1; j<=2*n-i; j++)
                scanf("%d",&a[i][j]);
        dp[1][1]=a[1][1];
        for(int i=1; i<=n; i++)
            for(int j=i; j>=1; j--)
                dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+a[i][j];
        for(int i=n+1; i<2*n; i++)
            for(int j=1; j<=2*n-i; j++)
                dp[i][j]=max(dp[i-1][j],dp[i-1][j+1])+a[i][j];

        printf("Case %d: %d\n",ans++,dp[2*n-1][1]);
    }
    return 0;
}

 

posted @ 2016-08-13 22:47  踮起脚望天  阅读(432)  评论(1编辑  收藏  举报