動態規劃初步 城市裡的間諜

2022-05-02 11:42:10 字數 1517 閱讀 8762

一、題目

某城市的地鐵是線性的,有n(2 ≤ n ≤ 50)個車站,從左到右編號為1~n。有m1輛車從第一站開始往右開,還有m2輛從第n站開始往左開。在時刻0,mario從第一站出發,目的是在t時刻會見在n站的乙個間諜。要求其在車站的等待時間足夠短。

二、解題思路

狀態由當前時間和當前所在站決定,我們可以用dp[i][j]表示在時刻t,第i站最少還需要等待的時間。易只t時刻的情況容易確定,

dp[t][j] = (j == n ? inf : 0),而t時刻之前的dp值,可以由t時刻及其之後的決定。

即dp[i][j] = max(dp[i][j] + 1,dp[i + t[j]][j + 1],dp[i + t[j - 1][j - 1]]) (加入三種選擇都存在時)

根據狀態轉移方程和邊界值,我們就可以從下至上填滿整個**,dp[0][1]就是要求的。

三、**實現

1 #include2 #include3 #include

4 #include5 #include6

using

namespace

std;78

const

int inf = 0x3f3f3f3f;9

const

int maxn = 50 + 10;10

const

int maxt = 200 + 10;11

intn, t, cost_time[maxn],m1,m2;

12int dp[maxt][maxn]; //

dp[t][i]表示在時刻t,第i站最少還需要等待的時間

13int has_train[maxt][maxn][2]; //

has_train[i][j][0]表示i時刻,在j車站有開往左的火車,has_train[i][j][1]表示i時刻,在j車站有開往右的火車

14int kase = 1;15

16void

slove()

1733

}34 printf("

case number %d:

", kase++);

35if (dp[0][1] >= inf) printf("

impossible\n");

36else printf("

%d\n

", dp[0][1

]);37}38

39int

main()

4059}60

61 scanf("

%d", &m2);

62for (int i = 0; i < m2; i++)

6371}72

73slove();74}

75return0;

76 }

四、經驗

ctime變數與標準庫里自帶的衝突了;之前陣列開小了,導致runtime error。

動態規劃 城市裡的間諜

解題思路 本題利用動態規劃解決,時刻i和所在的車站j構成了乙個狀態,每個狀態都有三種決策 1 等待1分鐘。2 搭乘向右開的車 如果有 3 搭乘向左開的車 如果有 如果用d i,j 表示在時刻i,位於車站j時最少的等待時間,那麼對於三種決策,可得到如下的狀態轉移方程 1 d i,j d i 1,j 1...

UVa 1025 城市裡的間諜

題意 乙個間諜要從第乙個車站到第n個車站去會見另乙個,在是期間有n個車站,有來回的車站,讓你在時間t內時到達n,並且等車時間最短,輸出最短等車時間。思路 先用乙個has train t i 0 來表示在t時刻,在車站i,是否有往右開的車。同理,has train t i 1 用來儲存是否有往左開的車...

動態規劃初步

基本原理 類似於遞迴解題,把問題丟給上一層來解決,找出狀態轉換方程即可。當然關鍵問題是如何定義遞迴陣列與找出狀態轉換方程。hello world 走樓梯 有n階樓梯,每次能走一步或兩步,請問有多少種走法。設f n 是n階樓梯不同的走法。則轉移到此狀態的方法有兩種,從n 1階樓梯走一步上來,或者從n ...