UVa 590 Always on the run(简单链式DP)
生活随笔
收集整理的這篇文章主要介紹了
UVa 590 Always on the run(简单链式DP)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
有n座城市,Trisha要求在這n座城市旅游k天,從城市1出發,第k天到達城市n。
輸入有n*(n-1)行,每n-1行代表i到除了i之外的其他城市航班的天數以及價格。
求出Trisha的最小花費。
思路:
鏈式dp,dp[i][d]代表第d天到達i城市所需要的最小代價,于是dp[i][d] = min(dp[i][d], dp[j][d-1] + price[j][i][X])。
意思是:第d天到達i城市所花費的代價是,第d-1天到達j城市 + j到i的價格 最小的一個。
由于初識狀態只有一個,即從城市1出發。所以初始值只有一個dp[1][0] = 0。
#include <cstdio> #include <cstdlib> #include <cstring> #include <climits>#define min(a,b) (((a) < (b)) ? (a) : (b))int day[15][15]; int price[15][15][35]; int dp[15][1005];int main() {int n, k;int cases = 0;while (scanf("%d %d", &n, &k) && n && k){for (int i = 1; i <= n; ++i)for (int j = 1; j <= n; ++j)if (i != j) {scanf("%d", &day[i][j]);for (int d = 1; d <= day[i][j]; ++d)scanf("%d", &price[i][j][d]);}for (int i = 0; i <= n; ++i){for (int d = 0; d <= k; ++d)dp[i][d] = INT_MAX;}dp[1][0] = 0;for (int d = 1; d <= k; ++d)for (int i = 1; i <= n; ++i)for (int j = 1; j <= n; ++j)if (i != j){int q = (d - 1) % day[j][i] + 1;if (price[j][i][q] && dp[j][d-1] != INT_MAX)dp[i][d] = min(dp[i][d], dp[j][d-1] + price[j][i][q]);}printf("Scenario #%d\n", ++cases);if (dp[n][k] != INT_MAX)printf("The best flight costs %d.\n\n", dp[n][k]);elseprintf("No flight possible.\n\n");}return 0; }?
?
轉載于:https://www.cnblogs.com/kedebug/archive/2012/11/19/2776892.html
總結
以上是生活随笔為你收集整理的UVa 590 Always on the run(简单链式DP)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】C#委托事件浅析
- 下一篇: F#的快排