UVA 590 - Always on the run
小偷要從城市1經過k天道城市n,給出這n個城市之間的航班表,要求第k天到城市n的最小花費。
dp[i][j] 第i天小偷在城市j的最小花費。
枚舉第i-1天其所在的城市k,找出(k-j)在第i天的航班價格s,
dp[i][j] = min(dp[i-1][k] + s);
#include <bits/stdc++.h>
using namespace std;
const int INF = 999999999;
struct Node {
int b;
int t[33];
}p[12][12];
int dp[1005][33];
int _get(int a, int b, int c) {
if (p[b][c].b != 0 && p[b][c].t[a%p[b][c].b] != 0) {
return p[b][c].t[a%p[b][c].b];
} else {
return INF;
}
}
int n, k;
int main () {
for (int cases = 1; scanf ("%d%d", &n, &k) == 2; ++cases) {
if (n == 0 && k == 0) break;
for (int i=1; i<=n; i++) {
for (int j=1; j<=n; j++) {
if (i == j) continue;
scanf ("%d", &p[i][j].b);
for (int k=0; k<p[i][j].b; k++) {
scanf ("%d", &p[i][j].t[k]);
}
}
}
for (int i=0; i<=k; i++) {
fill(dp[i], dp[i]+n+1, INF);
}
dp[0][1] = 0;
for (int i=1; i<=k; i++) {
for (int j=1; j<=n; j++) {
for (int k=1; k<=n; k++) {
if (k == j) continue;
dp[i][j] = min(dp[i][j], dp[i-1][k] + _get(i-1, k, j));
}
}
}
printf("Scenario #%d\n", cases);
if (dp[k][n] == INF) printf("No flight possible.\n");
else printf("The best flight costs %d.\n", dp[k][n]);
printf("\n");
}
return 0;
}