http://acm.hdu.edu.cn/showproblem.php?pid=2391

一路逆着推过去

View Code
#include <stdio.h>
#include <string.h>
const int INF=100000000;
int map[1001][1001],dp[1001][1001];
int Max(int a,int b,int c)
{
    int max=-INF;    
    if(a>max)max=a;
    if(b>max)max=b;
    if(c>max)max=c;
    return max;
}
int main()
{
    int t;
    scanf("%d",&t);
    for(int cas=1;cas<=t;cas++)
    {
        int r,c;
        scanf("%d%d",&r,&c);
        for(int i=0;i<r;i++)
            for(int j=0;j<c;j++)
            {
                scanf("%d",&map[i][j]);
                dp[i][j]=map[i][j];
            }
        for(int i=r-1;i>=0;i--)
            for(int j=c-1;j>=0;j--)
                dp[i][j]=Max(dp[i][j+1],dp[i+1][j+1],dp[i+1][j])+map[i][j];
        printf("Scenario #%d:\n",cas);
        printf("%d\n\n",dp[0][0]);
    }
    return 0;
}