题解:B4140 [信息与未来 2016] 方格取数
分析
本题为没有任何难度的水题,先造出数据,然后直接按题意爆搜,遍历每一条值严格递增的路径,打擂台取最大值即可。 (同名题目,但难度天差地别)
Code
#include <bits/stdc++.h>
using namespace std;
int n, m, s;
int a[110][110];
int maxn = -1, maxx = -1;
void dfs(int x, int y, int ans) {
maxn = max(maxn, ans); // 打擂台取最大值
if(a[x+1][y] > a[x][y]) {
dfs(x+1, y, ans + a[x+1][y]);
}
if(a[x][y+1] > a[x][y]) {
dfs(x, y+1, ans + a[x][y+1]);
}
if(a[x-1][y] > a[x][y]) {
dfs(x-1, y, ans + a[x-1][y]);
}
if(a[x][y-1] > a[x][y]) {
dfs(x, y-1, ans + a[x][y-1]);
}
}
int main() {
scanf("%d%d%d", &n, &m, &s);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
s = (s * 345) % 19997;
a[i][j] = s % 10 + 1;
}
} // 生成数据
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
dfs(i, j, a[i][j]); // 爆搜
maxx = max(maxn, maxx);
/* 这里需要注意!!!
* 每一次爆搜取得的是从当前位置开始的最优解
* 而不是全局最优解
* 所以需要每爆搜一遍就更新答案
*/
maxn = -1;
}
}
printf("%d", maxx);
return 0;
}
AC 记录