1. 程式人生 > >POJ 1088 滑雪(記憶化搜尋)

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想知道載一個區域中最長底滑坡。區域由一個二維陣列給出。陣列的每個數字代表點的高度。下