题目:点击打开链接
思路:
这题主要是题目比较难看懂,看懂之后就比较容易了。
f[i][j] 表示第i天,到城市j的最少总花费
那么可以得到状态转移:
i=0, f[1][j] = cost[1][j][0];
i>0, f[i][j] = min{f[i][j], f[i-1][k]+cost[k][j], k!=j}
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long int64;
const int INF = 0x3f3f3f3f;
const int MAXN = 1010;
int n, m;
int f[MAXN][12], cost[12][12][32], d[12][12];
int main(){
int cas = 1;
while(~scanf("%d%d", &n, &m) && n+m){
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j)if(i!=j){
scanf("%d", &d[i][j]);
for(int k=0; k<d[i][j]; ++k)
scanf("%d", &cost[i][j][k]);
}
}
memset(f, INF, sizeof(f));
// 第一天, 只能从1出发
for(int j=2; j<=n; ++j){
if(cost[1][j][0])
f[0][j] = cost[1][j][0];
}
// 第一天以后
for(int i=1; i<m; ++i){
for(int k=1; k<=n; ++k){
for(int j=1; j<=n; ++j)if(j!=k){
int tmp_cost = cost[j][k][i%d[j][k]];
if(tmp_cost) f[i][k] = min(f[i][k], f[i-1][j]+tmp_cost);
}
}
}
int ans = INF;
for(int i=1; i<n; ++i)
ans = min(ans, f[m-1][n]);
printf("Scenario #%d\n", cas++);
if(ans != INF){
printf("The best flight costs %d.\n\n", ans);
}else{
puts("No flight possible.\n");
}
}
return 0;
}
分享到:
相关推荐
开源项目-codingsince1985-UVa#uva-online-judge-solutions-in-golang.zip,两年来每天都在解决一个uva在线裁判问题,算起来…
判断输入字符串是否为镜像或回文串。 来源于UVaOJ - 401. 水题。
uva705 Slash Maze 的代码,在UVaOJ上通过
PDF试题
uva532 Dungeon Master的源代码,并且AC了
Algorithm-UVA-Solutions-in-Python.zip,python 3中各种uva(acm)问题的解决方案。,算法是为计算机程序高效、彻底地完成任务而创建的一组详细的准则。
这是UVA133 TheDoleQueue救济金发放问题,经典的算法问题。初学算法的人要对这种算法非常熟悉并且能熟练运用。
tpcw-nyu-uva-client 客户端
leetcode 2 算法-Java UVa Online Judge(ACM-ICPC Live ...使用:数组、哈希表、链表、二分搜索、动态规划、堆栈、堆、reedy、排序、树 DFS、BFS、图、二分搜索树、递归、记忆、队列、映射等。...Uva-ACM-ICPC