大意不再赘述。
思路:
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;
}
本文介绍了一道使用动态规划解决的城市间旅行问题。通过定义状态转移方程,实现从任意城市出发到达目标城市所需的最小费用计算。文章提供了完整的C++代码实现,并展示了如何进行状态转移。
1612

被折叠的 条评论
为什么被折叠?



