HDU 1224(Free DIY Tour)

动态规划题,状态转移方程为 dp[i] = max(dp[i], dp[j] + map[j][i]),dp 保存到达此城市的最大魅力值,j 是可以到达 i 的城市。

#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 105;

int map[MAXN][MAXN]; //景点之间的通路
int price[MAXN]; //景点的魅力值
int pre[MAXN]; //前一个城市,pre[i]表示目前路线上i城市的前一个是j城市
int dp[MAXN]; //动态规划数组,dp[i]表示从起点到达i城市的最大魅力值

//递归从前到后输出
void output(int x)
{
	if (x == -1)
		return;
	output(pre[x]);
	cout << x << "->";
}

int main()
{
	int T;
	cin >> T;
	int n, m;
	int count = 1; //测试用例数
	while (T--)
	{
		cin >> n;
		for (int i = 1; i <= n; ++i)
		{
			cin >> price[i];
		}

		price[n + 1] = 0; //起点作为终点时没有魅力值
		pre[1] = -1; //起点没有前向城市
		memset(dp, 0, sizeof(dp));
		memset(map, -1, sizeof(map));

		cin >> m;
		int i, j, k;
		for (k = 1; k <= m; ++k)
		{
			cin >> i >> j;
			map[i][j] = price[j]; //将到达城市的魅力值作为路线的魅力值
		}

		for (int i = 1; i <= n + 1; i++) //动态规划
		{
			for (int j = 1; j < i; j++)
			{
				if (map[j][i] != -1 && dp[j] + map[j][i] > dp[i])
				{
					dp[i] = dp[j] + map[j][i];
					pre[i] = j;
				}
			}
		}

		if (count > 1)
			cout << endl;
		cout << "CASE " << count++ << "#" << endl;
		cout << "points : " << dp[n + 1] << endl;
		cout << "circuit : ";
		output(pre[n + 1]);
		cout << 1 << endl;
	}
	return 0;
}

继续加油。

发布了152 篇原创文章 · 获赞 1 · 访问量 7625

猜你喜欢

转载自blog.csdn.net/Intelligence1028/article/details/104672220