題目描述
長江遊艇俱樂部在長江上設置了n 個遊艇出租站1,2,…,n。遊客可在這些遊艇出租站租用遊艇,並在下游的任何一個遊艇出租站歸還遊艇。遊艇出租站i 到遊艇出租站j 之間的租金爲r(i,j),1< =i< j < =n。試設計一個算法,計算出從遊艇出租站1 到遊艇出租站n 所需的最少租金。
輸入
第1 行中有1 個正整數n(n<=200),表示有n個遊艇出租站。接下來的n-1 行是r(i,j),1< =i< j < =n。
輸出
從遊艇出租站1 到遊艇出租站n所需的最少租金
樣例輸入
3
5 15
7
樣例輸出
12
代碼
#include<iostream>
using namespace std;
int main(){
int n;
int a[200][200];
cin>>n;
for(int i = 1; i < n; i++){
for(int j = i; j < n; j++){
cin>>a[i][j];
int s = a[1][i-1] + a[i][j];
if(a[1][j] > s) a[1][j] = s;
}
}
cout<<a[1][n-1]<<endl;
return 0;
}
結果
思路
此題是動態規劃問題,用到了floyd算法。
爲了便於理解,以下圖例子來做解釋:
-
第一行輸入的n表示站點數,後面n-1行表示租金,第二行會輸入n-1個數,並且後面輸入數據的規律是增加一個行數輸入 數據會依次減少一個數據。所以上圖是階梯形狀。第n行只有一個數,表示倒數第二個站點到最後一個站點的租金;
-
帶有淺藍色背景的數據就是是輸入數據,爲了操作方便,把其放入二維數組當中;
-
第一行的數據存儲第一個站點到第n個站點(其他任意站點)的最少租金,輸入第m個站點到後面站點的各租金時,n到m站點的最少租金便已求得。