1. 程式人生 > >POJ 1088 滑雪(動態規劃經典)

POJ 1088 滑雪(動態規劃經典)

滑雪
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 63875 Accepted: 23387

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
思路:該題是動態規劃的經典題目,要用到記憶化搜尋,深度優先遍歷。每次求出從每個點出發的最長路徑長度,全域性最優解包含區域性最優解。
AC程式碼:
#include<iostream>
#include<cstring>

using namespace std;
int area[105][105];  //儲存每個點的高度
int len[105][105];   //儲存從每個點出發得到的最長路徑長度
int r,c;
int max(int a,int b,int c,int d)
{
    if(a<b)
        a=b;
    if(a<c)
        a=c;
    if(a<d)
        a=d;
    return a;
}

int longest(int i,int j,int height)
{
    if(i<0||j<0||i>=r||j>=c||height<=area[i][j]) return 0;   //遇到邊界或者該點的高度比前一個搜尋的點的高度大,則返回
    if(len[i][j]>=0) return len[i][j];                         //若len[i][j]>0,說明該點已經被搜尋過
    len[i][j]=max(longest(i-1,j,area[i][j]),longest(i+1,j,area[i][j]),longest(i,j-1,area[i][j]),longest(i,j+1,area[i][j]))+1;
    return len[i][j];
}

int main()
{
    int i,j;
    memset(len,-1,sizeof(len));              //初始化len陣列
    cin>>r>>c;
    for(i=0; i<r; i++)
        for(j=0; j<c; j++)
            cin>>area[i][j];

    int max=0,l=0;
    for(i=0; i<r; i++)
        for(j=0; j<c; j++)
        {
            l=longest(i,j,area[i][j]+1);
            if(l>max)
                max=l;
        }
    cout<<max<<endl;



    return 0;
}

相關推薦

POJ 1088 滑雪動態規劃經典

滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 63875 Accepted: 23387 Description Michael喜歡滑雪百這並不奇怪, 因為滑雪的確很刺激。可是為了獲得速度

poj 1088滑雪 動態規劃

滑雪Time Limit: 1000MSMemory Limit: 65536KTotal Submissions: 59524Accepted: 21672DescriptionMichael喜歡滑雪百這並不奇怪, 因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向

poj 1088 滑雪動態規劃:記憶化搜尋

這個題開始想著用動態規劃遞推來做的 但是根本不知從哪裡下手 想了下還是記憶化更方便 我的方法是先把邊界設定為無窮大 每次dfs知道當前點周圍沒有比它還低的位置即可 0ms程式碼如下: #include

POJ 1088 滑雪動態規劃解題報告

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

編輯距離動態規劃經典

1183 編輯距離 編輯距離,又稱Levenshtein距離(也叫做Edit Distance),是指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數。許可的編輯操作包括將一個字元替換成另一個字元

poj 1088 滑雪-----DP 動態規劃

滑雪 Time Limit:1000MS Memory Limit:65536K Total Submissions:57209 Accepted:20771 Description Michael喜歡滑雪百這並不奇怪, 因為滑雪的確很刺激。可是為了

Leetcode 120. Triangle 三角形問題動態規劃經典 解題報告

1 解題報告 首先我承認我很二哈,這道題我明明已經做過了,但是剛剛不知道為什麼又去做了一遍,而且我查了下兩次的解法還有所差別(貌似是現在的版本有進步了呢) 問題就是一個三角形的陣列,求從頂部到下方的最短路徑。。 這個問題是太過經典+Easy的DP問題了,哈

POJ 1088 滑雪 記憶化搜尋

                                                                滑雪 Time Limit:1000MS    Memory Lim

POJ 1088 滑雪記憶化搜尋

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

滑雪動態規劃+dfs

描述 Michael喜歡滑雪百這並不奇怪, 因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待升降機來載你。Michael想知道載一個區域中最長的滑坡。區域由一個

POJ 1088 滑雪 記憶化、動態規劃、排序優化

滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 108063 Accepted: 41157 Description Michael喜歡滑雪百這並不奇怪, 因為

POJ 1088: 滑雪經典 DP+記憶化搜索

esp roman ted font eof 個人 algorithm set str 滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 74996

poj(1088)——滑雪經典遞推型動歸

題意: 中文題,就是在所有的點中找一個點作為起點,然後叫你找出從起點開始的最長路徑是多少。 這裡高度必須嚴格遞減。 思路: 一開始我碰到這題時,沒有思路,是看題解寫的。 但是今天我回頭再去看時,發現自己能夠獨立寫出來了,而且和上次的方法不一樣。也許這就是進步吧! 其實就是一

poj - 1088 - 滑雪dp

target art dsm 題目 ipp 每次 元素 org mod 題意:一個R * C的矩陣(1 <= R,C <= 100),元素代表該點的高度h(0<=h<=10000),從隨意點出發,每次僅僅能走上、下、左、右。且將要到的高度要比

POJ 1088 滑雪 搜尋

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

POJ 3181 Dollar Dayz動態規劃+大數

題目傳送門 Description Farmer John goes to Dollar Days at The Cow Store and discovers an unlimited number of tools on sale. During his first

合併石子動態規劃經典

步驟: 1. 設狀態:f[i][j]表示從第i堆合併到第j堆,合併成一堆的最小得分 2. 初始狀態:f[i][i]=0;     最終狀態:f[1][n];//從第1堆合併到第n堆的最小得分 3.狀態轉移方程:f[i][j]=max(f[i][j],f[i][k]+f[k+

滑雪動態規劃

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

數組中最長的升序子序列動態規劃問題

ace dia mic enc namespace 進行 strong main log The longest Increasing Subsequence (LIS) 給定一個序列,找到這個序列的一個最長的子序列,使得子序列的所有元素是升序的,且元素之間的相對位置不變

BZOJ4828 AHOI/HNOI2017大佬動態規劃+bfs

math sub pre per 級別 include name map esp   註意到懟大佬的操作至多只能進行兩次。我們逐步簡化問題。   首先令f[i][j]表示第i天結束後自信值為j時至多有多少天可以進行非防禦操作(即恢復自信值之外的操作)。這個dp非常顯然。由於