hdu 1078 FatMouse and Cheese
一只老鼠从(1,1)出发每次最远只能水平或竖直移动不超过k个曼哈顿距离,且能移动到下一个点的条件是下一个点的权值大于现在这个点。
记忆化搜索。搜索状态是(行,列),直接四个方向上的k种移动方式枚举然后取max保存就好。
#include <bits/stdc++.h> #define pb push_back #define mp make_pair #define x first #define y second #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 #define up rt,rt<<1,rt<<1|1 #define mem(x) memset(x,0,sizeof(x)) #define mem1(x) memset(x,-1,sizeof(x)) #define LMissher using namespace std; typedef long long ll; typedef double db; const int M = 1e5+7; const double pi = acos(-1); const int inf = 2147483647; const int mod = 1e9+7; int n,k; int dp[107][107],a[107][107]; int dfs(int i,int j){ if(dp[i][j]) return dp[i][j]; int ans=0; for(int jj=1;jj<=k;jj++){ if(i-jj>0) if(a[i][j]<a[i-jj][j]) ans=max(ans,dfs(i-jj,j)); } for(int jj=1;jj<=k;jj++){ if(i+jj<=n) if(a[i][j]<a[i+jj][j]) ans=max(ans,dfs(i+jj,j)); } for(int jj=1;jj<=k;jj++){ if(j-jj>0) if(a[i][j]<a[i][j-jj]) ans=max(ans,dfs(i,j-jj)); } for(int jj=1;jj<=k;jj++){ if(j+jj<=n) if(a[i][j]<a[i][j+jj]) ans=max(ans,dfs(i,j+jj)); } dp[i][j]=ans+a[i][j]; return dp[i][j]; } int main(){ #ifdef LMissher freopen("1.in","r",stdin); freopen("1.out","w",stdout); #endif while(~scanf("%d%d",&n,&k)){ if(n==-1&&k==-1) break; mem(dp); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&a[i][j]); printf("%d\n",dfs(1,1)); } return 0; }

浙公网安备 33010602011771号