UVA 590 Always on the run

本文介绍了一道使用动态规划解决的城市间旅行问题。通过定义状态转移方程,实现从任意城市出发到达目标城市所需的最小费用计算。文章提供了完整的C++代码实现,并展示了如何进行状态转移。

大意不再赘述。

思路:

2013新年第一题,新年新气象,祝自己和广大ACMER们,好好学习,天天向上,身体健康...还有,我喜欢的人也是喜欢我的人。

状态转移方程:f[i][d] = min{f[i][d-1] + cost[j][i][t]};

当前状态:当时间为d-1时,位于j城市的最小消费。

决策:飞去其他的n-1个城市。(+ cost [j][i][t], t = (d-1) % day[j][i])

转移:当时间为d时,位于i城市的最小消费。

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;

const int INF = 0x3f3f3f3f;

int f[20][1010];
int cost[20][20][40];
int day[20][20];

int n, k;

void init()
{
	memset(f, INF, sizeof(f));
	memset(cost, 0, sizeof(cost));
	f[1][0] = 0;
}

int read_case()
{
	init();
	scanf("%d%d", &n, &k);
	if(!n && !k) return 0;
	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= n; j++) if(i != j)
		{
			scanf("%d", &day[i][j]);
			for(int k = 0; k < day[i][j]; k++)
			{
				scanf("%d", &cost[i][j][k]);
			}
		}
	}
	return 1;
}

int dp()
{
	for(int d = 1; d <= k; d++)
	{
		for(int i = 1; i <= n; i++)
		{
			for(int j = 1; j <= n; j++) if(i != j)
			{
				int t = (d-1) % day[j][i];
				if(f[j][d-1] != INF && cost[j][i][t])
				{
					f[i][d] = min(f[i][d], f[j][d-1] + cost[j][i][t]);
				}
			}
		}
	}
	return f[n][k];
}

void solve()
{
	int ans = dp();
	if(ans != INF) printf("The best flight costs %d.\n", ans);
	else printf("No flight possible.\n");
	printf("\n");
}

int main()
{
	int times = 0;
	while(read_case())
	{
		printf("Scenario #%d\n", ++times);
		solve();
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值