nefu 169 步步惊心

步步惊心


Problem : 169     Time Limit : 1000ms     Memory Limit : 65536K


description

马尔泰·若曦是康熙年间镇西大将军马尔泰的小女儿,自幼失母,却深得父亲姐姐宠爱,性格活泼任性。张晓,本是21世纪一都市白领,聪慧谨慎,玲珑剔透。因车祸而灵魂穿越到若曦身上,自此开始了步步惊心的宫庭之旅,并身不由己卷进了九龙夺嫡的风波。在这里,若曦与大清未来的皇帝----雍正皇帝新觉罗·胤禛相遇,并上演了一场爱恨情仇中的生死挣扎。权利与亲情、与爱情;欲望和名利下上演一场场惊天动地,凄凉婉转的、曲折的惊心动魄的历史片段。最后在无奈和挣扎中香消玉损,只留下雍正痛苦的坚持和对大清的责任。
   若曦刚来到北京皇宫时,就对复杂的皇宫所迷惑---屋子太多了。皇宫的屋子是m行n列的方格,进到理想的屋子里会得到奖赏(银子),走到禁闭的屋子要扣月厘(银子),难啊。若曦从左下角(1,1)位置,走到右上角(m,n)位置,通过最短的距离能获得的最多银子是多少啊?

(1,1)是左下角的屋子的坐标。


input
输入数据有多组,每组第一行有2个数m和n(0 < m,n <=100),代表m行,n列,接下来有m行,每行n个数;这m行里的第1行的n个数代表的是皇宫位置m行的位置;而这m行里的第2行的n个数代表的是皇宫位置m-1行的位置;依次;这m行里的第m行的n个数代表的是皇宫位置第1行的位置;具体见图就明白了!每个屋子能得到或失去银子的值为0~100,得到用正数,失去用负数表示。


output

输出从(1,1)位置开始,走到右上角(m,n)位置,通过最短的距离若曦能获得的最大银子数(不为了银子,谁穿越啊)!


sample_input
5 5
1 2 7 1 4
1 -6 -7 -3 -2
-6 20 2 0 4
-2 12 6 24 30

10 12 13 -9 -4


sample_output

101


hint
sample_input 中的10是(1,1)位置,而4是(5,5)位置,别错!

要求通过最短的距离即在图中只能往上或往右走!


source


分析:

简单动规。每个位置的银子=max(左边的,下边的)+自身。

注意边界,因为有负数,所以边界设为0的话是错误的。。


代码:

//一开始被边界坑了。。


#include <iostream>


using namespace std;


int max(int a,int b)
{
    if(a>b) return a;
    return b;
}


int main()
{
    int m,n,a[102][102],f[102][102];
    while(cin>>m>>n)
    {
        for(int i=1;i<=m;i++)
            for(int j=1;j<=n;j++)
                cin>>a[i][j];
        f[m][1]=a[m][1];
        for(int i=m;i>=1;i--)
            for(int j=1;j<=n;j++)
            {
                if(i==m&&j==1) f[i][j]=a[i][j];
                else if(i==m&&j>1) f[i][j]=f[i][j-1]+a[i][j];
                else if(i<m&&j==1) f[i][j]=f[i+1][j]+a[i][j];
                else if(i==1&&j==1) f[i][j]=f[i+1][j]+a[i][j];
                else f[i][j]=max(f[i+1][j],f[i][j-1])+a[i][j];
            }


        cout<<f[1][n]<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值