動態規劃 城市裡的間諜

2021-08-05 22:01:35 字數 3009 閱讀 5209

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

(1) d(i,j)=d(i+1,j)+1;

(2) d(i,j)=min(d(i,j),d(i+t[j],j+1));

(3) d(i,j)=min(d(i,j),d(i+t[j-1],j-1));

處理狀態之前可以先用陣列has_train表示時刻i,位於車站j,有無向右(向左)的車。

**(1):

[cpp]view plain

copy

print?

#define _crt_secure_no_warnings 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;  

#define inf 9999999

#define maxn 250+50

intt, n, m1, m2;  

intt[maxn];  

inta[maxn], b[maxn];  

inthas_train[maxn][maxn][2];  

intdp[maxn][maxn];  

intmain()  

}  scanf("%d"

, &m2);  

for(

inti = 1; i <= m2; i++)  

}  for(

inti = 1; i <= n - 1; i++)  

dp[t][i] = inf;  

dp[t][n] = 0;  

for(

inti = t - 1; i >= 0;i--)  

for(

intj = 1; j <= n; j++)  

cout << "case number "

<< ++kase << 

": "

;  if

(dp[0][1] >= inf)cout << 

"impossible\n"

;  else

cout << dp[0][1] << 

'\n'

;  }  

return

0;  

}  

**(2):

#include

#define inf 0x3f3f3f3f

using

namespace

std;  

intn,t;  

intt[55];  

intm1,m2;  

intd[55];  

inte[55];  

intdp[210][55];  

bool

ht[210][55][2];  

intkase;  

intmain()  

}  scanf("%d"

,&m2);  

for(

inti=1;i<=m2;i++)  

}  for(

inti=1;i

dp[t][i]=inf;  

dp[t][n]=0;  

for(

inti=t-1;i>=0;i--)  

for(

intj=1;j<=n;j++)  

printf("case number %d: "

,++kase);  

if(dp[0][1]>=inf) puts(

"impossible"

);  

else

printf(

"%d\n"

,dp[0][1]);  

}  return

0;  } 

**(3):

#include 

#include 

#include 

#include 

#define inf 0x3fffffff

using

namespace

std;  

intti[22];  

intto_right[55];  

intto_left[55];  

bool

has_train[220][55][2];  

intdp[220][55];  

intmain()  

}  for(

inti =1;i<=m2;i++)  

}  //書上的**

for(

inti =1;i<=n-1;i++) dp[t][i] = inf;  

dp[t][n] = 0;  

for(

inti = t-1;i>=0;i--)  

if(j > 1 && has_train[i][j][1] && i+ti[j-1] <= t)  

}  }  

printf("case number %d: "

,cas++);  

if(dp[0][1] >= inf) puts(

"impossible"

);  

else

printf(

"%d\n"

,dp[0][1]);  

}  return

0;  

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

一 題目 某城市的地鐵是線性的,有n 2 n 50 個車站,從左到右編號為1 n。有m1輛車從第一站開始往右開,還有m2輛從第n站開始往左開。在時刻0,mario從第一站出發,目的是在t時刻會見在n站的乙個間諜。要求其在車站的等待時間足夠短。二 解題思路 狀態由當前時間和當前所在站決定,我們可以用d...

UVa 1025 城市裡的間諜

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

uva 1025,城市的間諜

題意 地鐵是線性的,有n個站,編號 1 n m1輛從左至右的車,和m2輛從右至左的車,發車時刻給出,然後是,每兩個站之間要跑多長時間。乙個間諜要從1車站到n車站,但是他要求等車的時間最短,不然間諜會被抓,有可能到不了,輸出impossible.分析 影響每一步的決策只有兩個因素,1,時刻,2,哪乙個...