动态规划之游艇租用问题
问题描述:
长江俱乐部在长江设置了n个游艇出租站1,2,…n,游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i到游艇出租站j之间的租金为r(i,j),设计一个算法,计算出从出租站1到出租站n所需要的最少租金。
样例输入:
3
5 15
7
样例输出:
12
分析:
fin[i][j] 表示从i站到j站的最少租金
最优子结构:
fin[i][j] = fin[i][k] + r[k][j]; (i<=k<=j);
先从r = 2开始迭代,r表示问题规模,当问题规模增加到n是,便可求出最优解。很简单的区间动规
/*
租用游艇问题
课本80页习题3.6
测试数据
3
5 15
7
*/
#include<iostream>
#include<cstring>
#include<algorithm>
#define MAX_N 1010
using namespace std;
static int ri[MAX_N][MAX_N];
static int fin[MAX_N][MAX_N];
void dp(int n)
{
for(int r = 2;r <= n;r ++ ){
for(int i = 1;i < n;i ++ ){
int j = i + r - 1;
fin[i][j] = fin[i][j-1] + ri[j-1][j];
for(int k = i + 1;k <= j;k ++ ){
int t = fin[i][k] +fin[k][j];
if(fin[i][j] > t){
fin[i][j] = t;
}
}
}
}
cout << "最优值" <<endl;
cout << fin[1][n] <<endl;
}
int main()
{
int n;
cout << "请输入出租站的个数" << endl;
cin >> n;
for(int i = 1;i < n;i ++ ){
for(int j = i + 1;j <= n;j ++ ){
cin >> ri[i][j];
}
}
dp(n);
cout << "最优值表" << endl;
for (int i = 1;i <= n;i ++ ){
for(int j = 1;j <= n;j ++ ){
cout << fin[i][j] << " ";
}
cout << endl;
}
return 0;
}