SWUST OJ 之 0574 Renting Boats

长江游艇俱乐部在长江上设置了n 个游艇出租站1,2,…,n。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i 到游艇出租站j 之间的租金为r(i,j),1< =i< j < =n。试设计一个算法,计算出从游艇出租站1 到游艇出租站n 所需的最少租金。

输入

第1 行中有1 个正整数n(n<=200),表示有n个游艇出租站。接下来的n-1 行是r(i,j),1< =i< j < =n。

输出

从游艇出租站1 到游艇出租站n所需的最少租金

样例输入

3
5 15
7

样例输出

12

分析

这道动态规划题灰常简单(o(^□^)o),一个一维数组就搞定;
现在我们来思考一下,对于每个点 j 的租金 = min(j 点已经计算的租金,前面的任意一点 i 已经花费 + i 到 j 要花费的租金);
即公式: cost[ j ] = min(cost[ j ],cost[ i ] + link[ i ][ j ]);

        

简单吧!!!
这样解题思路就出来了,下面我们来看代码;

代码

// test.cpp: 定义控制台应用程序的入口点。
//

#include
#include
#include
#include
#include
#include
#define INF 0x3f3f3f3f
using namespace std;

int dp[205][205];
int cost[205];

void init(int n)
{
	for (int i = 0; i <= n; i++)
	{
		for (int j = 0; j <= n; j++)
		{
			dp[i][j] = INF;
		}
	}
	for (int i = 0; i <= n; i++)
	{
		cost[i] = INF;
	}
}

int main()
{
	int n;
	cin >> n;

	init(n);		//初始化
	for (int i = 1; i <= n - 1; i++)		//给出值,是到之后各点的花费
	{
		for (int j = i + 1; j <= n; j++)
		{
			cin >> dp[i][j];
		}
	}

	cost[1] = 0;	        //起点花费置为0
	for (int i = 1; i <= n - 1; i++)
	{
		for (int j = i + 1; j <= n; j++)	//从第二个点开始计算花费
		{
			cost[j] = min(cost[j], cost[i] + dp[i][j]);
		}
	}

	cout << cost[n] << endl;			//最后一个就为终点最优花费


    return 0;
}

 

你可能感兴趣的:(SWUST,OJ题库,动态规划,算法练习,编程练习)