AcWing 274 移動服務 線性DP

2021-09-25 10:13:05 字數 1464 閱讀 5049

乙個公司有三個移動服務員,最初分別在位置1,2,3處。

如果某個位置(用乙個整數表示)有乙個請求,那麼公司必須指派某名員工趕到那個地方去。

某一時刻只有乙個員工能移動,且不允許在同樣的位置出現兩個員工。

從 p 到 q 移動乙個員工,需要花費 c(p,q)。

這個函式不一定對稱,但保證 c(p,p)=0。

給出n個請求,請求發生的位置分別為 p1p1~pnpn。

公司必須按順序依次滿足所有請求,目標是最小化公司花費,請你幫忙計算這個最小花費。

第1行有兩個整數l,n,其中l是位置數量,n是請求數量,每個位置從1到l編號。

第2至l+1行每行包含l個非負整數,第i+1行的第j個數表示c(i,j) ,並且它小於2000。

最後一行包含n個整數,是請求列表。

一開始三個服務員分別在位置1,2,3。

輸出乙個整數m,表示最小花費。

3≤l≤200

1≤n≤1000

思路:dp[i][j][k] 表示第i個請求,兩個人分別在j和k位置,另乙個人在a[i]位置時的最小花費,那麼分別考慮3個人中哪個在這一次去服務,dp[i + 1][j][k] = min(dp[i + 1][j][k], dp[i][j][k] + c[a[i]][a[i + 1]]);

dp[i + 1][a[i]][k] = min(dp[i + 1][a[i]][k], dp[i][j][k] + c[j][a[i + 1]]);

dp[i + 1][j][a[i]] = min(dp[i + 1][j][a[i]], dp[i][j][k] + c[k][a[i + 1]]);

邊界不妨設a0 = 3, dp[0][1][2] = 0, 代表起始狀態。

#includeusing namespace std;

typedef long long ll;

#define lson l, mid, rt << 1

#define rson mid + 1, r, rt << 1|1

const int maxn = 1e3 + 10;

const int inf = 0x3f3f3f3f;

int c[205][205], a[maxn];

int dp[maxn][205][205];

int main()}}

int ans = inf;

for(int i = 1; i <= m; ++i)

for(int j = 1; j <= m; ++j)

ans = min(ans, dp[n][i][j]);

printf("%d\n", ans);

return 0;}/*

5 90 1 1 1 1

1 0 2 3 2

1 1 0 4 1

2 1 5 0 1

4 2 3 4 0

4 2 4 1 5 4 3 2 1

*/

acwing 274 移動服務(線性dp)

乙個公司有三個移動服務員,最初分別在位置1,2,3處。如果某個位置 用乙個整數表示 有乙個請求,那麼公司必須指派某名員工趕到那個地方去。某一時刻只有乙個員工能移動,且不允許在同樣的位置出現兩個員工。從 p 到 q 移動乙個員工,需要花費 c p,q 這個函式不一定對稱,但保證 c p,p 0。給出n...

274 移動服務

乙個公司有三個移動服務員,最初分別在位置1,2,3處。如果某個位置 用乙個整數表示 有乙個請求,那麼公司必須指派某名員工趕到那個地方去。某一時刻只有乙個員工能移動,且不允許在同樣的位置出現兩個員工。從 p 到 q 移動乙個員工,需要花費 c p,q 這個函式不一定對稱,但保證 c p,p 0。給出n...

線性DP 274 移動服務

線性dp,肯定以任務為階段 3個人的位置為附屬條件 其中乙個人的位置一定是任務完成的地點,即省去一維 o n l 3 include using namespace std typedef long long ll typedef int128 ll typedef unsigned long lo...