1. 程式人生 > >洛谷P1434 [SHOI2002]滑雪 記憶化搜尋

洛谷P1434 [SHOI2002]滑雪 記憶化搜尋

注意:本題求的是最長的滑坡長度,而不是高度

用ans[x][y]表示從(x,y)這一點開始的最長滑坡

那麼只要上下左右四個方向的高度比這一點的高度小,ans[x][y]就等於ans[x-1][y]或ans[x+1][y]或ans[x][y+1]或ans[x][y-1]加一,再從這幾個值裡選擇一個最大的就行了

#include<iostream>
using namespace std;
int r,c;//r是行,c是列 
int a[105][105],ans[105][105];//ans[i][j]儲存i,j位置可到達的最大長度 
int dx[4]={1,0,-1,0},dy[4]={0
,1,0,-1};//下,右,上,左四個方向 int res(int x,int y)//求(x,y)位置開始的最長滑坡 { if(ans[x][y]>0)return ans[x][y]; int i,maxx=0; for(i=0;i<=3;i++)//列舉4個方向 { int nx=x+dx[i]; int ny=y+dy[i]; if(nx>=1&&nx<=r&&ny>=1&&ny<=c&&a[x][y]>a[nx][ny])//
沒有越界並且高度低於(x,y)的高度 { int t=res(nx,ny)+1;//長度加1 maxx=max(t,maxx); } } ans[x][y]=maxx; return maxx; } int main() { cin>>r>>c; int i,j; for(i=1;i<=r;i++) for(j=1;j<=c;j++) cin>>a[i][j];//輸入每一點的高度 int
maxx=0; for(i=1;i<=r;i++) for(j=1;j<=c;j++) maxx=max(maxx,res(i,j));//列舉所有位置開始的長度,找到最大的 cout<<maxx+1<<endl; }