【p1434】洛谷P1434滑雪題解及記憶化搜索的基本步驟
阿新 • • 發佈:2018-06-20
沒有 pac amp pri ring %d 產生 AR stream
滑雪是一道dp及記憶化搜索的經典題目。
所謂記憶化搜索便是在搜索的過程中邊記錄邊搜索的一個算法。
當下次搜到這裏時,便直接使用。
而且記憶化搜索一定要滿足無後效性,為什麽呢,因為如果不滿足無後效性的話,可能在不同的時候調用這個值所產生的結果並不同。
因此一定要滿足無後效性。
且記憶化搜索一定要用深搜,因為如果廣搜的話,記憶化搜索就沒有什麽作用了。(因為廣搜一定是先搜到最優結果)
再說滑雪這道題,可以用動態規劃來做,當然也可以用記憶化搜索。
可以將dp數組當作記憶化搜索的數組
在記憶化搜索中如果已經搜到這個結果,就記錄,當下次搜到這個地方時,看他是否有沒有被記錄過,如果記錄過了,直接使用就好了。
滑雪這個題的意思便是當要其余四個方向的值的高度比要當前的高度大的時候,當前高度便是那四個方向的高度的最大值+1.
最後結果是所有的點的最大值
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int dx[4]={-1,0,1,0}; int dy[4]={0,-1,0,1}; int map[110][110]; int dp[110][110]; int r,c; int m_search(int x,int y) { if(dp[x][y])return dp[x][y]; int tot=1; for(int i=0;i<4;i++) { int nx=x+dx[i]; int ny=y+dy[i]; if(map[x][y]<map[nx][ny]) { int tmp=m_search(nx,ny)+1; if(tmp>tot) tot=tmp; } } dp[x][y]=tot;return tot; } int main() { memset(map,233,sizeof(map));//一開始調為最小值 scanf("%d%d",&r,&c); for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) scanf("%d",&map[i][j]); int ans=0; for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) { dp[i][j]=m_search(i,j); ans=max(ans,dp[i][j]); } printf("%d\n",ans); return 0; }
【p1434】洛谷P1434滑雪題解及記憶化搜索的基本步驟