问题描述
0---1----2---3----4--... n
某旅游城市在长江边开辟了若干个旅游景点。一个游船俱乐部在这些景点都设置了游船出租站,游客可在泽泻游船出租
站租用游船,并在下游的任何一个游船出租站归还游船,从一个悠长出租站到下游的游船出租站间的租金明码标价。你
的任务是为游客计算从起点站到终点之间的最少租船费用。
输入样例
3
2 3 6 //从起点 0 到第1 ,2 ,3个站的租金,下同
1 3
2
3 //第二个问题
4 7 9
4 5
6
输出样例
case 1:5
case 2:9
*/
//解答代码,这是看一个教程书抄的,觉得不错就拿来分享一下
/*
文件名称: 游船费问题
创建日期: 2013/3/29
*/
/*
动态规划
*/
#include <iostream>
using namespace std;
const int MAX = 100;
int n, r[MAX][MAX], money[MAX][MAX];
void moneyDP(int rr[MAX][MAX], int mm[MAX][MAX], int nn);
void show(const int rr[MAX][MAX]);
int main()
{
int i = 0, j = 0, num = 0, a = 0;
while (cin >> n)
{
if (n == 0) break;
else
{
num++;
for (i = 0; i < n; i++)
for (j = i + 1; j <= n; j++)
{
cin >> a; r[i][j] = a;
}
moneyDP(r, money, n);
cout << "case" << num << ":\t";
cout << money[0][n] << endl;
}show (money);
}
return 0;
}
void moneyDP(int rr[MAX][MAX], int mm[MAX][MAX], int nn)
{
int i = 0, j = 0, num = 0, temp = 0, t = 0;
for (i = 0; i < nn; i++)
for (j = i + 1; j <= nn; j++)
{//赋初值
mm[i][j] = rr[i][j];
}
for (i = 0; i <= nn; i++) mm[i][i] = 0;
show(rr);
for (t = 2; t <= nn; t++)
for (i = 0; i <= nn - t; i++)
{
temp = rr[i][i + t];
for (j = i + 1; j < i + t; j++)
{
if (temp > mm[i][j] + mm[j][i + t])
temp = mm[i][j] + mm[j][i + t];
mm[i][i + t] = temp;
}
}
return ;
}
void show(const int rr[MAX][MAX])
{
int i = 0, j = 0;
for (i = 0; i < n; i++)
{
for (j = i + 1; j <= n; j++)
{//赋初值
cout << "(" << i << "," << j << ") = "<< rr[i][j] << "\t";
}
cout << endl;
}
}