uva 590 dp

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章