题目描述
小智养了一条狗,有一天把它带出来遛,路过一片玉米地,他的狗用一种很萌的眼神告诉他饿了(狗要吃玉米?!暂且不讨论这个问题……)。小智没办法,只好带他进去偷,不过为了不被发现,他们只能往下、左、右三个方向走(有联系吗?……),走过的点上如果有玉米,他们就会全部偷走,然后那里的玉米就木有了。这是一个高端的农场,某些点会设有机器人,当你走到这些机器人的时候会掉落一定的玉米(然后就消失了),然后这个机器人就不再起作用了。
小智想到反正都来了,不如多偷一点,所以他想知道从第一行任意一个位置开始,一直到最后一行任意一个位置结束,最终他最多能得到多少的玉米。
输入
第 1 行一个整数,N,表示 N×N 的玉米地
第 2 ~ n+1 行,每行 N 个整数,Aij 表示第 i 行 j 列上的玉米数,如果 Aij 为负数,表示遇到机器人,必须要掉落 |Aij| 的玉米数。相邻整数用一个空格隔开。
输出
输出文件一行一个整数,最后获得的玉米数。
样例输入 复制
3
5 0 8
1 1 3
-10 0 -10
样例输出 复制
18
提示
对于 10%的数据:N<=3
对于 30%的数据:没有机器人(即全为非负数)
对于所有数据:N<=50,-10000<= Aij <=10000
样例解释:(1,1) → (1,2) → (1,3) → (2,3) → (2,2) → (2,1) → (2,2) → (3,2) → 结束
#include<iostream>
using namespace std;
const int = 0x3f3f3f3f;
int n , a[55][55];
int w(int x , int y)
{
//自己想吧,提示到这儿就行了,自己写吧,加油!
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
cin >> a[i][j];
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
sun[i][j] = sun[i][j - 1] + a[i][j];
int num = -inf;
for(int i = 1; i <= n; i++)
num = max(num , w(1 , i));
cout << num << endl;
return 0;
}