描述
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)
函式沒有首先判斷i
和j
的取值而直接返回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 最外層也...