動規之遊艇租用問題
阿新 • • 發佈:2018-12-09
動態規劃之遊艇租用問題
問題描述:
長江俱樂部在長江設定了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;
}