POJ 1088 滑雪(記憶化搜尋)
如果我們一個一個點去搜的話,肯定會超時,因為有些點會被重複搜尋,這樣就很浪費時間,所以我們需要用dp來標記一下,因此dp就用來標記當前點的最長距離,如果搜尋到的點的dp已經有值了,那麼就返回這個dp值直接用就好了(避免重複搜尋),因為可以往四個方向去搜,所以用sum來求四個方向的最遠距離然後賦值給dp。
AC程式碼:
#include <iostream> #include <cstdio> #include <cstring> #define maxn 105 using namespace std; int MAP[maxn][maxn],dp[maxn][maxn]; int dir[4][2] = {1,0,0,1,-1,0,0,-1}; int ans,n,m; bool Check(int x,int y){ if(x >= 0 && y >= 0 && x < n && y < m)return true; return false; } int dfs(int x,int y){ if(dp[x][y])return dp[x][y]; int sum = 0; for(int i=0;i<4;i++){ int X = x + dir[i][0]; int Y = y + dir[i][1]; if(Check(X,Y) && MAP[X][Y] > MAP[x][y]){ sum = max(sum,dfs(X, Y)); } } dp[x][y] = sum + 1; return dp[x][y]; } int main() { scanf("%d%d",&n,&m); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ scanf("%d",&MAP[i][j]); } } memset(dp,0,sizeof(dp)); ans = 0; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ ans = max(ans, dfs(i,j)); } } printf("%d\n",ans); return 0; }
相關推薦
POJ 1088 滑雪 記憶化搜尋
滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 85082 Accepted: 31876 Description Michael喜歡滑雪百這並不奇怪, 因為滑雪的確很刺激。可是為了獲得
POJ 1088 滑雪(記憶化搜尋)
如果我們一個一個點去搜的話,肯定會超時,因為有些點會被重複搜尋,這樣就很浪費時間,所以我們需要用dp來標記一下,因此dp就用來標記當前點的最長距離,如果搜尋到的點的dp已經有值了,
poj 1088 滑雪 記憶化搜尋
程式碼: #include <iostream> #include <cstdio> #include <cstring> using namespace st
POJ 1088 滑雪(記憶化搜尋+DFS)
滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 83489 Accepted: 31234 Description Michael喜歡滑雪百這並不奇怪, 因為滑雪的確很刺激。可是為了
POJ 1088滑雪(記憶化搜尋)
滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 69948 Accepted: 25796 Description Michael喜歡滑雪百這並不奇怪, 因為滑雪的確很刺激。可是為了獲得速度
poj 1088 滑雪 (記憶化搜尋)
滑雪 Description Michael喜歡滑雪百這並不奇怪, 因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待升降機來載你。Michael想知道載一個區域中最長底滑坡。區域由一個二維陣列給出。陣列的每
poj 1088 dp記憶化搜尋狀態( or dfs)
這道滑雪的題當時陳月航他們來講過的,但是忘完了,就只記得這道題是dp+記憶化搜尋 這道題我先用dp遞迴的方式搜出來結果,感覺有點像搜尋的樣子,但是提交上去直接超時 然後我就想到了貌似要用記憶化搜尋,坑了很多次,中間忽略了兩個地方(在程式碼中指出) 其實這道dp和迷宮
洛谷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]加一,再從這幾個值裡選擇一個最大的就行
poj 1088 滑雪 深度優先搜尋
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 107901 Accepted: 41084 Description Michael喜歡滑雪百這並不奇怪, 因為滑雪
滑雪 POJ - 1088 (記憶化搜尋/動態規劃)
傳送門 題意:找出一條降序的路徑,使得這條路徑最長,輸出長度即可。 題解:對於每個點都進行dfs,dfs的同時進行記憶化搜尋即可。 附上程式碼: #include<iostream> #include<cstdio> using namespace std
poj 1088 滑雪 動態規劃(記憶化搜尋)
ichael喜歡滑雪百這並不奇怪, 因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待升降機來載你。Michael想知道載一個區域中最長底滑坡。區域由一個二維陣列給出。陣列的每個數字代表點的高度。下面是一個例子 1 2
poj 1088 滑雪(動態規劃:記憶化搜尋)
這個題開始想著用動態規劃遞推來做的 但是根本不知從哪裡下手 想了下還是記憶化更方便 我的方法是先把邊界設定為無窮大 每次dfs知道當前點周圍沒有比它還低的位置即可 0ms程式碼如下: #include
POJ 1088 滑雪 (記憶化搜尋)
滑雪 Time Limit:1000MS Memory Lim
POJ 1088 滑雪(記憶化搜尋)
Michael喜歡滑雪百這並不奇怪, 因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待升降機來載你。Michael想知道載一個區域中最長底滑坡。區域由一個二維陣列給出。陣列的每個數字代表點的高度。下面是一個
poj 1088 滑雪[zz] 記憶化搜尋
題意:給出一些高度,從一個位置劃只能往周圍四個方向滑,且高度遞減。。求最長的滑行區域。 這道題應該是用DP做,但是沒咋搞過DP所以也木有什麼想法。。 在網上看可以用記憶化搜尋做,記憶化搜尋 = 搜尋方式 + DP思想 ,大概的意思就是把已經搜過的節點狀態儲存起來,避免重
POJ 1088: 滑雪(經典 DP+記憶化搜索)
esp roman ted font eof 個人 algorithm set str 滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 74996
POJ 1088 滑雪 (記憶化、動態規劃、排序優化)
滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 108063 Accepted: 41157 Description Michael喜歡滑雪百這並不奇怪, 因為
POJ 1088 滑雪 (搜尋)
Description Michael喜歡滑雪百這並不奇怪, 因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待升降機來載你。Michael想知道載一個區域中最長底滑坡。區域由一個二維陣列給出。陣列的每個數字代表點的高度。下面是一個例子
poj 1198 / hdu 1401 Solitaire (記憶化搜尋+meet in middle)
題目大意:給你一個8*8的棋盤,上面有四個棋子,給你一個初始排布,一個目標排布,每次移動,可以把一個棋子移動到一個相鄰的空位,或者跨過1個相鄰的棋子,在保證棋子移動不超過8次的情況下,問能否把棋盤上的棋子由初始排布變成目標排布 8*8的棋盤,剛好不爆ull,狀壓那些位置有棋子 然後從初始狀態開始,暴搜出當
滑雪 【記憶化搜尋】
滑雪 Michael喜歡滑雪百這並不奇怪, 因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待升降機來載你。Michael想知道載一個區域中最長底滑坡。區域由一個二維陣列給出。陣列的每個數字代表點的高度。下