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

POJ 1088 滑雪 記憶化搜尋

滑雪
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 85082 Accepted: 31876

Description

Michael喜歡滑雪百這並不奇怪, 因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待升降機來載你。Michael想知道載一個區域中最長底滑坡。區域由一個二維陣列給出。陣列的每個數字代表點的高度。下面是一個例子 
 1  2  3  4 5

16 17 18 19 6

15 24 25 20 7

14 23 22 21 8

13 12 11 10 9

一個人可以從某個點滑向上下左右相鄰四個點之一,當且僅當高度減小。在上面的例子中,一條可滑行的滑坡為24-17-16-1。當然25-24-23-...-3-2-1更長。事實上,這是最長的一條。

Input

輸入的第一行表示區域的行數R和列數C(1 <= R,C <= 100)。下面是R行,每行有C個整數,代表高度h,0<=h<=10000。

Output

輸出最長區域的長度。

Sample Input

5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

Sample Output

25

Source

SHTSC 2002
dp[i][j]表示長度,從i=1,j=1;開始搜尋如果四周有大於a[i][j]例如a[i-1][j]那麼遞迴求temp=max(a[i-1][j],dfs(i-1,j)

迴圈跟新每個點的高度最後迴圈求出dp[i][j]的最大值。

ACcode:

#pragma warning(disable:4786)//使命名長度不受限制
#pragma comment(linker, "/STACK:102400000,102400000")//手工開棧
#include <map>
#include <set>
#include <queue>
#include <cmath>
#include <stack>
#include <cctype>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#define rd(x) scanf("%d",&x)
#define rd2(x,y) scanf("%d%d",&x,&y)
#define rds(x) scanf("%s",x)
#define rdc(x) scanf("%c",&x)
#define ll long long int
#define maxn 105
#define mod 1000000007
#define INF 0x3f3f3f3f //int 最大值
#define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;++i)
#define MT(x,i) memset(x,i,sizeof(x))
#define PI  acos(-1.0)
#define E  exp(1)
using namespace std;
int a[maxn][maxn],dp[maxn][maxn],n,m;
int dfs(int x,int y){
    if(dp[x][y]!=0)
        return dp[x][y];
    //if(x<1||x>n||y<1||y>m)
       // return 0;
    if(x==0 || x==n+1 || y==0 || y==m+1)
        return 0;
    int cnt=0;
    if(a[x-1][y]<a[x][y])
        cnt=max(cnt,dfs(x-1,y));
    if(a[x+1][y]<a[x][y])
        cnt=max(cnt,dfs(x+1,y));
    if(a[x][y-1]<a[x][y])
        cnt=max(cnt,dfs(x,y-1));
    if(a[x][y+1]<a[x][y])
        cnt=max(cnt,dfs(x,y+1));
    dp[x][y]=cnt+1;
    return cnt+1;
}
int main(){
    while(rd2(n,m )!=EOF){
        MT(dp,0);
        FOR(i,1,n)
            FOR(j,1,m)
            rd(a[i][j]);
        FOR(i,1,n)
            FOR(j,1,m)
            dfs(i,j);
        int maxxx=-1;
        FOR(i,1,n)
            FOR(j,1,m)
                maxxx=max(maxxx,dp[i][j]);
        printf("%d\n",maxxx);
    }
    return 0;
}
/*
5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
*/


相關推薦

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