POJ - 1088 记忆化搜索

迭代式不知道怎么敲
DFS就很清晰

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<vector>
#include<iterator>
#define rep(i,j,k) for(int i = j; i <= k; i++)
#define scan(a) scanf("%d",&a)
#define println(a) printf("%lld\n",a)
using namespace std;
const int maxn = 2e2+11;
const int oo = 0x3f3f3f3f;
const int dx[]={0,1,0,-1};
const int dy[]={1,0,-1,0};
int R,C;
int G[maxn][maxn],dp[maxn][maxn];
inline bool ok(int i,int j){return i>=1&&i<=R&&j>=1&&j<=C;}

int DP(int i,int j){
    if(!ok(i,j)) return -oo;
    if(dp[i][j]!=-1) return dp[i][j];
    int maxlen=1;
    rep(k,0,3){
        int x=i+dx[k],y=j+dy[k];
        if(ok(x,y)&&G[x][y]>G[i][j]) maxlen=max(maxlen,DP(x,y)+1);
    }
    return dp[i][j]=maxlen;
}
int main(){
    ios::sync_with_stdio(0);
    while(cin>>R>>C){
        rep(i,1,R) rep(j,1,C) cin>>G[i][j];
        memset(dp,-1,sizeof dp);
        int ans=0;
        rep(i,1,R)rep(j,1,C)ans=max(ans,DP(i,j));
        cout<<ans<<endl;
    }
    return 0;
}
posted @ 2017-12-12 14:52  Caturra  阅读(120)  评论(0)    收藏  举报