题目描述
设有 n×m 的方格图,每个方格中都有一个整数。现有一只小熊,想从图的左上角走到右下角,每一步只能向上、向下或向右走一格,并且不能重复经过已经走过的方格,也不能走出边界。小熊会取走所有经过的方格中的整数,求它能取到的整数之和的最大值。
输入格式
第一行有两个整数 n,m。
接下来 n 行每行 m 个整数,依次代表每个方格中的整数。
输出格式
一个整数,表示小熊能取到的整数之和的最大值。
输入输出样例
输入 #1复制
3 4 1 -1 3 2 2 -1 4 -1 -2 2 -3 -1
输出 #1复制
9
输入 #2复制
2 5 -1 -1 -3 -2 -7 -2 -1 -4 -1 -2
输出 #2复制
-10
说明/提示
样例 1 解释
样例 2 解释
#include <bits/stdc++.h>
using namespace std;
int n,m;//行 列
long long Map[1010][1010];//储存数字方格
long long f[1010][1010][2];//处理答案
long long mx(long long a,long long b,long long c)//比较函数
//输出三个数中最大的
{
if (a>b)
{
if (a>c)
{
return a;
}
else
{
return c;
}
}
else
{
if (b>c)
{
return b;
}
else
{
return c;
}
}
}
long long dfs(int x,int y,int from)//输入来源
{
if (x<1||y<1||x>n||y>m)//特殊输出
{
return -0x3f3f3f3f;
}
if (f[x][y][from]!=-0x3f3f3f3f)//已有数据
{
return f[x][y][from];
}
if (from==0)//来自上面
{
f[x][y][from]=mx(dfs(x+1,y,0),dfs(x,y-1,0),dfs(x,y-1,1))+Map[x][y];
}
else//来自下面
{
f[x][y][from]=mx(dfs(x-1,y,1),dfs(x,y-1,0),dfs(x,y-1,1))+Map[x][y];
}
return f[x][y][from];
}
int main()
{
//输入
cin >> n >> m;
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++)
{
cin >> Map[i][j];//输入数字
f[i][j][0]=f[i][j][1]=-0x3f3f3f3f;
//无论是从上面or下面来的 都将map中同位置设为最小值
}
}
f[1][1][1]=f[1][1][0]=Map[1][1];
//无论是上面or下面来的 开始点都设为map的值
cout << dfs(n,m,1);
return 0;
}