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;
}
View Code

 

posted @ 2018-09-10 14:29  LMissher  阅读(92)  评论(0)    收藏  举报