poj1088 dp 記憶化搜索 (入門好題)

題目意思很簡單,一開始我直接DFS深搜,超時果果的,看了題解以後,學習了記憶化搜索,就是記錄下已經求出的當前結點的最大值,在之後訪問到這個節點時,就能直接調用結果,減少重複計算。是一道好題。

以下爲代碼:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;

int r,c,a[150][150],len[150][150];
int xr[]={0,1,0,-1};
int yr[]={-1,0,1,0};
int  dfs(int x,int y)
{

    if(len[x][y]!=-1)return len[x][y];

    int sum=1;
    for(int i=0;i<4;i++){
        int xx=x+xr[i];
        int yy=y+yr[i];
        if(xx>0 && xx<=r && yy>0 && yy<=c )
            if(a[xx][yy]>a[x][y])
                sum=max(sum,dfs(xx,yy)+1);

    }
    len[x][y]=sum;
    return sum;

}
int main()
{
    //freopen("in.txt","r",stdin);
    while(scanf("%d%d",&r,&c)!=EOF){
        memset(a,-1,sizeof(a));
        for(int i=1;i<=r;i++)
            for(int j=1;j<=c;j++)
                scanf("%d",&a[i][j]);

        int ret=0;
        memset(len,-1,sizeof(len));
        for(int i=1;i<=r;i++)
            for(int j=1;j<=c;j++){
                ret=max(ret,dfs(i,j));
            }
        printf("%d\n",ret);
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章