P1434 滑雪

/* 
題型:記憶化動歸 
注意哪裏return,返回的是一個i,j的dp的值   
*/   
  
#include<cstdio>  
#include<algorithm>  
using namespace std;  
const int maxn=102;  
int n,m;  
int map[maxn][maxn];  
int d[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//方向數組  
int ans=0;  
int f[maxn][maxn];  
bool jilu[maxn][maxn];  
int dp(int x,int y)//一個i,j的dp   
{  
    if(jilu[x][y]) return f[x][y];//記憶化   
    jilu[x][y]=1;//即visited或mark   
    int tp=0;  
    for(int i=0;i<4;i++)  
    {  
        int newx=x+d[i][0];  
        int newy=y+d[i][1];  
        if(map[newx][newy]<map[x][y] && newx>=1 && newy>=1 && newx<=n && newy<=m)//判斷出界   
          tp=max(tp,dp(newx,newy));  
    }  
    f[x][y]=tp+1;//等都判斷完了,路程加本身的1   
    return f[x][y];  
}  
int main()  
{  
    scanf("%d%d",&n,&m);//長寬   
    for(int i=1;i<=n;i++)  
    {  
        for(int j=1;j<=m;j++)  
         scanf("%d",&map[i][j]);  
    }  
    for(int i=1;i<=n;i++)  
    {  
        for(int j=1;j<=m;j++)  
         ans=max(ans,dp(i,j));//ans記錄所有f(i,j)的最大值,由於記憶化的存在,多次調用dp並不會很慢  
    }  
    printf("%d",ans);  
    return 0;  
}   


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