CCPC-Wannafly Winter Camp 吃豆豆(dp)
题目描述
wls在玩一个游戏。
wls有一个n行m列的棋盘,对于第i行第j列的格子,每过T[i][j]秒会在上面出现一个糖果,第一次糖果出现在第T[i][j]秒,糖果仅会在出现的那一秒存在,下一秒就会消失。
假如wls第k秒在第i行第j列的格子上,满足T[i][j] | k,则wls会得到一个糖果。
假如当前wls在第ii行第jj列的格子上,那么下一秒他可以选择往上下左右走一格或停在原地。
现在请问wls从指定的S出发到达指定的T,并且在路上得到至少C个糖果最少需要多少时间?
wls在S的初始时间为第0秒。
输入描述
第一行三个整数n,m,C。
接下来nn行,每行m个整数T[i][j]。
接下来四个整数xs, ys, xt, yt,其中(xs, ys)表示S,(xt, yt)(表示t。
1≤n,m,T[i][j]≤10
1≤C≤1018
1≤xs,xt≤n
1≤ys,yt≤m
输出描述
一行一个整数表示答案。
样例输入 1
1 3 2 1 2 3 1 1 1 3
样例输出 1
3
三个纬度,前两维坐标后一位第几秒,因为最惨情况下走20000+步左右也都能获得足够的果实并走到终点,所以dp的大小不大。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 25000;
int sum[12][12][maxn];
int ti[12][12];
int n, m, c;
int main() {
ios::sync_with_stdio(0);
cin >> n >> m >> c;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> ti[i][j];
}
}
memset(sum, -0x3f3f3f3f, sizeof sum);
int stx, sty, enx, eny;
cin >> stx >> sty >> enx >> eny;
sum[stx][sty][0] = 0;
int ans = -1;
for (int s = 1; s < maxn; s++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
sum[i][j][s] = max(max(sum[i][j + 1][s - 1], sum[i][j - 1][s - 1]), max(sum[i - 1][j][s - 1], sum[i + 1][j][s - 1]));
sum[i][j][s] = max(sum[i][j][s], sum[i][j][s - 1]);
if (s%ti[i][j] == 0)sum[i][j][s]++;
if (sum[i][j][s] >= c&&i == enx&&j == eny) {
ans = s;
break;
}
}
if (ans != -1)break;
}
if (ans != -1)break;
}
cout << ans << "\n";
return 0;
}