问题描述
长江游艇俱乐部在长江上设置了 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 所需的最少租金。
数据输入
输入文件 input.txt
提供输入数据。文件的第 1 行有 1 个正整数 n(n ≤ 200),表示有 n 个游艇出租站。接下来的 n 行是 r(i, j)(1 ≤ i ≤ j ≤ n)。
结果输出
将计算出的从游艇出租站 1 到游艇出租站 n 所需的最少租金输出到文件 output.txt
。
input.txt
3
5 15
7
output.txt
12
#include <iostream> using namespace std; /* 3 5 15 7 和加括号也差不多,dp[i][j]=min(dp[i][k]+dp[k][j]) */ int n;//出租站 int dp[210][210]; void init(){ cin>>n; for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ cin>>dp[i][j]; } } for(int i=1;i<=n;i++){ dp[i][i]=0;//初始化,自己到自己不用花费 } } void solve(){ for(int len=2;len<=n;len++){//枚举区间长度 for(int i=1;i<n&&i+len-1<=n;i++){//枚举起点 int j=i+len-1;//终点 for(int k=i;k<=j;k++){ dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]); } } } cout<<dp[1][n]<<endl; } int main(){ init(); solve(); return 0; }
最新评论