2948 - 小猴子的难题(一)

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 64 MB

话说孙悟空取经的途中曾遇到一座大山,大山上有很多宝藏,当然了,妖怪也是在所难免的,此山能大能小,最高不过50米,最宽嘛也不过40米而已,此山是通往西天取经的必经之路,山上有很多的宝藏,宝藏都位于洞穴之中,你路过洞穴,就能获得宝藏,当然了,你遇到妖怪之后还要上交过路费,当宝藏大于等于0的时候,你就能获得它,当少于0的时候,说明洞穴中存在妖怪,你要上交过路费了,宝藏最大不超过100块,不小于-100块;小猴子是打不过他们的,因为他没有了72变,你要想问为什么,这个、、、
PS:此时的你位于左山脚下,你的任务就是到达山顶最右端,并取得最大的价值,以供在以后的路上开销,此山特别的神奇,当你每上升一层的时候,你的下面就全部自动消失了,当你每向右走一层的时候,你的左面也全部自动消失了;

<br />

<br />

题目输入

输入:
开始先输入一个T,表示下面有T组数据;
接下来会有T行,每行有两个数x,y,分别表示山的高和山的宽;
接下来有x行,每行有y个数;第一行表示最上面一层,第二行最上面的下面一层、、、最后一行表示最底层;

题目输出

输出:输出有一组数据,表示猴子所能获得的最大的金钱数;

输入/输出样例

输入格式

1
2 3
0 6 2
4 5 6

输出格式

17

C语言解答

#include<stdio.h>
int main()
{
    int max(int,int);
    int a[51][41],res[10000];
    int T,x,y,i,j,k,mark;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&x,&y);
        for(i=0; i<=x; i++)
        {
            for(j=0; j<=y; j++)
            {
                a[i][j]=-101;
            }
        }
        for(i=0; i<x; i++)
        {
            for(j=1; j<=y; j++)
            {
                scanf("%d",&a[i][j]);
            }
        }
        for(i=x-1; i>=0; i--)
        {
            for(j=1; j<=y; j++)
            {
                a[i][j]=a[i][j]+max(a[i+1][j],a[i][j-1]);
            }
        }
        printf("%d\n",a[0][y]);
    }

    return 0;
}
int max(int a,int b)
{
    int c;
    c=a>b?a:b;
    if(c>=(-100))
        return c;
    else
        return 0;
}

C++解答

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int a[50][50],t,x,y;
    cin>>t;
    while(t--)
    {
        cin>>x>>y;
        for(int i=1;i<=x;i++)
            for(int j=1;j<=y;j++)
              cin>>a[i][j];
        for(int i=0;i<=x;i++)
            a[i][0] = -1000;
        for(int i=0;i<=y;i++)
            a[x+1][i] = -1000;
        a[x][0]=a[x+1][1]=0;
        for(int i=x ; i>=1;i--)
            for(int j=1;j<=y;j++)
              a[i][j]=max(a[i][j-1],a[i+1][j])+a[i][j];
        cout<<a[1][y]<<endl;
    }
    return 0;
}