题目描述

 

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;
}