【HDU - 1078】FatMouse and Cheese (記憶化搜尋dp)
題幹:
FatMouse has stored some cheese in a city. The city can be considered as a square grid of dimension n: each grid location is labelled (p,q) where 0 <= p < n and 0 <= q < n. At each grid location Fatmouse has hid between 0 and 100 blocks of cheese in a hole. Now he's going to enjoy his favorite food.
FatMouse begins by standing at location (0,0). He eats up the cheese where he stands and then runs either horizontally or vertically to another location. The problem is that there is a super Cat named Top Killer sitting near his hole, so each time he can run at most k locations to get into the hole before being caught by Top Killer. What is worse -- after eating up the cheese at one location, FatMouse gets fatter. So in order to gain enough energy for his next run, he has to run to a location which have more blocks of cheese than those that were at the current hole.
Given n, k, and the number of blocks of cheese at each grid location, compute the maximum amount of cheese FatMouse can eat before being unable to move.
Input
There are several test cases. Each test case consists of
a line containing two integers between 1 and 100: n and k
n lines, each with n numbers: the first line contains the number of blocks of cheese at locations (0,0) (0,1) ... (0,n-1); the next line contains the number of blocks of cheese at locations (1,0), (1,1), ... (1,n-1), and so on.
The input ends with a pair of -1's.
Output
For each test case output in a line the single integer giving the number of blocks of cheese collected.
Sample Input
3 1 1 2 5 10 11 6 12 12 7 -1 -1
Sample Output
37
題目大意:
有一種遊戲是的玩法是這樣的:
有一個n*n的格子,每個格子有一個數字。
遵循以下規則:
1. 玩家每次可以由所在格子向上下左右四個方向進行直線移動,每次移動的距離不得超過m
2. 玩家一開始在第一行第一列,並且已經獲得該格子的分值
3. 玩家獲得每一次移動到的格子的分值
4. 玩家下一次移動到達的格子的分值要比當前玩家所在的格子的分值要大。
5. 遊戲所有數字加起來也不大,保證所有數字的和不會超過int型整數的範圍
6. 玩家僅能在n*n的格子內移動,超出格子邊界屬於非法操作
7. 當玩家不能再次移動時,遊戲結束
現在問你,玩家所能獲得的最大得分是多少?
輸入是n和m。
解題報告:
水題,,但是剛開始讀錯題,沒看到只能從(1,1)點開始遊戲 這個條件,所以WA了、、
AC程式碼:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int nx[4] = {0,1,0,-1};
int ny[4] = {1,0,-1,0};
ll dp[105][105];
int a[105][105];
int n,m;
bool ok(int x,int y) {
if(x>=1&&x<=n&&y>=1&&y<=n) return 1;
else return 0;
}
ll dfs(int x,int y) {
if(dp[x][y] != -1) return dp[x][y];
ll res = 0;
int tx,ty;
for(int k = 0; k<4; k++) {
tx = x;ty = y;
for(int i = 1; i<=m; i++) {
tx += nx[k];ty += ny[k];
if(ok(tx,ty)==0) continue;
if(a[tx][ty] <= a[x][y]) continue;
res = max(res,dfs(tx,ty));
}
}
return dp[x][y]=res+a[x][y];
}
int main()
{
while(~scanf("%d%d",&n,&m)) {
if(n==-1 && m==-1) break;
memset(dp,-1,sizeof dp);
ll ans = 0;
for(int i = 1; i<=n; i++) {
for(int j = 1; j<=n; j++) {
scanf("%d",&a[i][j]);
}
}
// for(int i = 1; i<=n; i++) {
// for(int j = 1; j<=n; j++) {
// ans = max(ans,dfs(i,j));
// }
// }
ans = dfs(1,1);
printf("%lld\n",ans);
}
return 0 ;
}