您的位置:首页 > 其它

uva 590 dp

2015-09-10 14:50 232 查看

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);

[code]#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]
 == INF) printf("No flight possible.\n");
        else printf("The best flight costs %d.\n", dp[k]
);
        printf("\n");
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: