1. 程式人生 > >動規之遊艇租用問題

動規之遊艇租用問題

動態規劃之遊艇租用問題

問題描述:
長江俱樂部在長江設定了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; }