uva 590 dp

来源:互联网 发布:安卓app源码如何修改 编辑:程序博客网 时间:2024/06/07 22:36

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;}
0 0
原创粉丝点击