題目描述 長江游艇俱樂部在長江上設置了n 個游艇出租站1,2,…,n。游客可在這些游艇出租站租用游艇,併在下游的任何一個游艇出租站歸還游艇。游艇出租站i 到游艇出租站j 之間的租金為r(i,j),1<=i<=j<=n。試設計一個演算法,計算出從游艇出租站1 到游艇出租站n 所需的最少租金。 對於給定的 ...
題目描述
長江游艇俱樂部在長江上設置了n 個游艇出租站1,2,…,n。游客可在這些游艇出租站租用游艇,併在下游的任何一個游艇出租站歸還游艇。游艇出租站i 到游艇出租站j 之間的租金為r(i,j),1<=i<=j<=n。試設計一個演算法,計算出從游艇出租站1 到游艇出租站n 所需的最少租金。
對於給定的游艇出租站i 到游艇出租站j 之間的租金為r(i,j),1<=i<j<=n,編程計算從游艇出租站1 到游艇出租站n所需的最少租金。
保證計算過程中任何時刻數值都不超過10^6
輸入輸出格式
輸入格式:由文件提供輸入數據。文件的第1 行中有1 個正整數n(n<=200),表示有n個游艇出租站。接下來的n-1 行是一個半矩陣r(i,j),1<=i<j<=n。
輸出格式:程式運行結束時,將計算出的從游艇出租站1 到游艇出租站n所需的最少租金輸出到文件中。
輸入輸出樣例
輸入樣例#1:3 5 15 7輸出樣例#1:
12
本來是DP,讓我做成了最短路。。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 using namespace std; 6 void read(int & n) 7 { 8 char c='+';int x=0;int flag=0; 9 while(c<'0'||c>'9') 10 { 11 c=getchar(); 12 if(c=='-') 13 flag=1; 14 } 15 while(c>='0'&&c<='9') 16 x=x*10+(c-48),c=getchar(); 17 flag==1?n=-x:n=x; 18 } 19 const int MAXN=1001; 20 int maxt,n; 21 int dp[MAXN][MAXN]; 22 int main() 23 { 24 read(n); 25 for(int i=1;i<=n;i++) 26 for(int j=1;j<=n;j++) 27 dp[i][j]=438438; 28 for(int i=1;i<=n-1;i++) 29 for(int j=i+1;j<=n;j++) 30 read(dp[i][j]); 31 for(int k=1;k<=n;k++) 32 for(int i=1;i<=n;i++) 33 for(int j=1;j<=n;j++) 34 { 35 if(dp[i][k]!=438438&&dp[k][j]!=438438) 36 { 37 dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]); 38 } 39 } 40 cout<<dp[1][n]; 41 return 0; 42 }