FatMouse and CheeseTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 14527 Accepted Submission(s): 6146 Problem Description 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.
Input There are several test cases. Each test case consists of
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的矩阵里每一点有一定数量的奶酪,你每次离开这一点最多走k步,而且必须要走到奶酪比前一个多的才行,问你最多能吃多少奶酪。简单来说是一个dp题,但是也可以当做记忆化搜索来入门,什么是记忆化搜索,就是用搜索的方式来解决dp而且和dp很类似,相对于dp来说更省时间,因为可以剪枝,所以花费的时间更少。
# include <iostream>
# include <cstring>
using namespace std;
const int maxn = 105;
int dp[maxn][maxn];
int str[maxn][maxn], n, k, dir[][2] = {0, 1, 0, -1, 1, 0, -1, 0};
//记忆化搜索一定是自顶向下的
int dfs(int x, int y)
{
int temp = 0;
for(int j = 1; j <= k; j++)//因为我走的是1 - k步
{
for(int i = 0; i < 4; i++)
{
int tx = x + dir[i][0] * j;
int ty = y + dir[i][1] * j;
if(tx < 0 || tx >= n || ty < 0 || ty >= n)
continue;
//因为我要比我原来的大
if(str[x][y] >= str[tx][ty])
continue;
if(dp[tx][ty])
{
temp = max(temp, dp[tx][ty]);
continue;
}
temp = max(temp, dfs(tx, ty));
}
}
return dp[x][y] = temp + str[x][y];
}
int main()
{
while(cin >> n >> k, (n!= -1 || k != -1))
{
memset(dp, false, sizeof(dp));
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
cin >> str[i][j];
}
}
cout << dfs(0, 0) << endl;
}
}