题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1078
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 |
题目大意:这个题目好绕啊,读了半天没读懂,还是在队友(猛哥)的帮助下才读懂了题,类似之前的滑雪(poj-1088)
给出一个地图,上面的数字代表那个地方的事物的数量,小老鼠从0,0点出发(只能从0,0点出发!),问小老鼠最多能吃多少个食物。
小老鼠一次只能走k步以内,只能水平或垂直行走,只能去有更多的食物的地方(要去的地方要比目前的地方的食物更多)
ac:
#include<stdio.h>
#include<string.h>
#include<math.h>
//#include<map>
//#include<set>
#include<deque>
#include<queue>
#include<stack>
#include<bitset>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define mod 998244353
//#define max(a,b) (a)>(b)?(a):(b)
//#define min(a,b) (a)<(b)?(a):(b)
#define clean(a,b) memset(a,b,sizeof(a))// 水印
//std::ios::sync_with_stdio(false);
int dp[110][110];
int map[110][110];
int fx[4]={1,-1,0,0},fy[4]={0,0,1,-1};
int n,k;
int dfs(int x,int y)
{
if(dp[x][y])
return dp[x][y];
int res=map[x][y];
for(int i=0;i<4;++i)
{
for(int j=1;j<=k;++j)
{
int nx=x+fx[i]*j,ny=y+fy[i]*j;
if(nx>=0&&nx<n&&ny>=0&&ny<n)
{
if(map[nx][ny]>map[x][y])
res=max(res,dfs(nx,ny)+map[x][y]);
}
}
}
return dp[x][y]=res;
}
int main()
{
std::ios::sync_with_stdio(false);
while(cin>>n>>k)
{
if(n==-1&&k==-1)
break;
clean(dp,0);
for(int i=0;i<n;++i)
{
for(int j=0;j<n;++j)
cin>>map[i][j];
}
// int ans=0;
// for(int i=0;i<n;++i)//小老鼠只能从(0,0)走没看见WA了两次。。
// {
// for(int j=0;j<n;++j)
// {
// ans=max(ans,dfs(i,j));
// }
// }
// for(int i=0;i<n;++i)
// {
// for(int j=0;j<n;++j)
// cout<<dp[i][j]<<" ";
// cout<<endl;
// }
cout<<dfs(0,0)<<endl;
}
}