标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 8610 Accepted Submission(s): 3611
题目链接:HDU 1078
题目中的k是指在当前位置可以最多直接从(x,y)跳到(x+k*dirx,y+k*diry),不是指只能总体上在直线上平移多少距离,比如一条直线3 2 4,若以3为起点当k=2时就可以直接从3跳到4,不然由于无法到小于当前格子食物数量的位置就只能是3了,跳过去就可以得到3+4=7的食物量。然后这题跟滑雪又不一样,滑雪是可以从任何一个位置为起点,这题只能从(0,0)开始,因此最后不是取max(样例很巧合地取max也是37,WA N次)而是直接输出dp[0][0]
代码:
#Include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define CLR(x,y) memset(x,y,sizeof(x))
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
typedef pair<int,int> pii;
typedef long long LL;
const double PI=acos(-1.0);
const int N=110;
int pos[N][N],dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int dp[N][N];
int n,k;
inline bool check(int x,int y)
{
return (x>=0&&x<n&&y>=0&&y<n);
}
int dfs(int x,int y)
{
if(dp[x][y])
return dp[x][y];
else
{
int maxm=0;
for (int s=1; s<=k; ++s)
{
for (int i=0; i<4; ++i)
{
int xx=x+s*dir[i][0];
int yy=y+s*dir[i][1];
if(check(xx,yy)&&pos[xx][yy]>pos[x][y])
maxm=max<int>(maxm,dfs(xx,yy));
}
}
return dp[x][y]=maxm+pos[x][y];
}
}
int main(void)
{
int i,j;
while (~scanf("%d%d",&n,&k)&&(n!=-1&&k!=-1))
{
CLR(dp,0);
for (i=0; i<n; ++i)
for (j=0; j<n; ++j)
scanf("%d",&pos[i][j]);
for (i=0; i<n; ++i)
for (j=0; j<n; ++j)
dfs(i,j);
printf("%d\n",dp[0][0]);
}
return 0;
}
HDU 1078 FatMouse and Cheese(记忆化搜索)
标签:
原文地址:http://www.cnblogs.com/Blackops/p/5876206.html