遞迴 動規問題中的邊界條件 以滑雪為例

2021-10-06 05:10:30 字數 2723 閱讀 2813

描述

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更長。事實上,這是最長的一條。

輸入

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

輸出

輸出最長區域的長度。

樣例輸入

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

樣例輸出

25
題目本身不難,筆者沒想太多就直接寫了:

#include

using

namespace std;

int r, c;

int height[

100]

[100

], method[

100]

[100];

intcal

(const

int i,

const

int j)

;int

main()

int opt =1;

for(

int i =

0; i < r;

++i)

for(

int j =

0; j < c;

++j)

cout << opt;

return0;

}int

cal(

const

int i,

const

int j)

;const

int _h_ = height[i]

[j];

res[0]

=(_h_[j])

?cal

(i -

1, j):0

; res[1]

=(_h_[j+1])

?cal

(i, j +1)

:0; res[2]

=(_h_[j])

?cal

(i +

1, j):0

; res[3]

=(_h_[j-1])

?cal

(i, j -1)

:0;int m =0;

for(

int s =

0; s <4;

++s)

method[i]

[j]= m +1;

return method[i]

[j];

}

結果一直wa,後來把陣列開成int height[101][101], method[101][101]才通過。檢查發現,wa的原因是cal(i,j)函式沒有首先判斷ij的取值而直接返回method[i][j]。這樣在r=c=100時,計算cal(r-1,c-1)涉及到cal(r,c-1)cal(r-1,c)的值,於是訪問method[r][c-1]method[r-1][c],發生陣列越界。

解決:交換兩層判斷的順序即可:

int

cal(

const

int i,

const

int j)

;const

int _h_ = height[i]

[j];

res[0]

=(_h_[j])

?cal

(i -

1, j):0

; res[1]

=(_h_[j+1])

?cal

(i, j +1)

:0; res[2]

=(_h_[j])

?cal

(i +

1, j):0

; res[3]

=(_h_[j-1])

?cal

(i, j -1)

:0;int m =0;

for(

int s =

0; s <4;

++s)

method[i]

[j]= m +1;

return method[i]

[j];

}

從遞迴到動規(學習筆記)

區別 動態規劃是由已知推未知,由子問題推大問題,由邊界值逆推,相當於遞迴的逆過程。解題思想 1.分解子問題 將原問題分為若干子問題,子問題形式與原問題相似,規模減小,子問題的解求出來即儲存,不影響其他子問題,避免重複求解。2.確定狀態 狀態就是與解相關的一組變數,例如數字三角形求到底邊最大值時,每個...

動規之遊艇租用問題

問題描述 長江俱樂部在長江設定了n個遊艇出租站1,2,n,遊客可在這些遊艇出租站租用遊艇,並在下游的任何乙個遊艇出租站歸還遊艇。遊艇出租站i到遊艇出租站j之間的租金為r i,j 設計乙個演算法,計算出從出租站1到出租站n所需要的最少租金。樣例輸入 35 15 7樣例輸出 12分析 fin i j 表...

矩陣連乘問題 區間動規

解答想法 共兩行第一行n 1 n 100 代表矩陣個數。第二行有n 1個數,分別為q 0 q 1 q n 1 q k 2000 代表第 k 個矩陣是q k 1 xq k 維的。共兩行第一行 m,為最優代價。注 測試用例中 m 值保證小於 2 31 第二行為最優順序。如 a1 a2a3 a4 最外層也...