题目描述
设有 𝑛 × 𝑚 的方格图,每个方格中都有一个整数。现有一只小熊,想从图的左上角走到右下角,每一步只能向上、向下或向右走一格,并且不能重复经过已经走过的方格,也不能走出边界。小熊会取走所有经过的方格中的整数,求它能取到的整数之和的最大值。
输入
输入文件名为 number.in。
第 1 行两个正整数 𝑛, 𝑚。
接下来 𝑛 行每行 𝑚 个整数,依次代表每个方格中的整数。
输出
输入文件名为 number.out。
一个整数,表示小熊能取到的整数之和的最大值。
样例输入
【样例 1 输入】
3 4
1 -1 3 2
2 -1 4 -1
-2 2 -3 -1
【样例 2 输入】
2 5
-1 -1 -3 -2 -7
-2 -1 -4 -1 -2
样例输出
【样例 1 输出】
9
【样例 2 输出】
-10
数据范围限制
对于 20% 的数据,𝑛, 𝑚 ≤ 5。
对于 40% 的数据,𝑛, 𝑚 ≤ 50。
对于 70% 的数据,𝑛, 𝑚 ≤ 300。
对于 100% 的数据,1 ≤ 𝑛, 𝑚 ≤ 1000。方格中整数的绝对值不超过 104。
解题:
题目大意:
给出一个 n × m n×m n×m的矩阵,每个格子有个权值,求从左上角到右下角的在大权值和(可以往右,上,下走)。
思路:
这道题用肉眼看都是用DP,但正常的DP做这道题不能向上走,所以我们考虑分类讨论:
从左边来的(i,j)的最大权值和为lefti,j ;
从上边来的(i,j)的最大权值和为upi,j ;
从下边来的(i,j)的最大权值和为downi,j 。
然而DP式显而易见:
- left可以从left,up,down更新;
- up可以从left,up更新;
- down可以从left,down更新;
更新的过程就和普通DP一样,注意顺序。
代码:
#include<cstdio>
#define Fu(i,a,b) for(int i=(a);i<=(b);i++)
#define Fd(i,a,b) for(int i=(a);i>=(b);i--)
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
#define INF 11999999999
long long n,m,a[1005][1005

最低0.47元/天 解锁文章
1648





