acwing 274 移動服務(線性dp)

2021-10-02 03:56:30 字數 2046 閱讀 5885

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

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

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

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

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

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

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

第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

5 9

0 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

5
首先題目說有三個人,他們一起去做任務,又因為他們三個人不能同時動,不能出現同乙個地方,所以一定有乙個人在上次完成的任務

然後我們列舉到底誰去完成當前的任務就行了,所以我們先假設他們分別位於b[i],x,y處,然後有三種情況:

位於b[i]的服務員出發前往b[i + 1],此時狀態變成f[i

+1][

x][y

]=f[

i][x

][y]

+w[b

[i]]

[b[i

+1]]

;f[i + 1][x][y] = f[i][x][y] + w[b[i]][b[i + 1]];

f[i+1]

[x][

y]=f

[i][

x][y

]+w[

b[i]

][b[

i+1]

];位於x的服務員出發前往b[i + 1],此時狀態變成f[i

+1][

b[i]

][y]

=f[i

][x]

[y]+

w[x]

[b[i

+1]]

;f[i + 1][b[i]][y] = f[i][x][y] + w[x][b[i + 1]];

f[i+1]

[b[i

]][y

]=f[

i][x

][y]

+w[x

][b[

i+1]

];位於y的服務員出發前往b[i + 1],此時狀態變成f[i

+1][

x][b

[i]]

=f[i

][x]

[y]+

w[y]

[b[i

+1]]

;f[i + 1][x][b[i]] = f[i][x][y] + w[y][b[i + 1]];

f[i+1]

[x][

b[i]

]=f[

i][x

][y]

+w[y

][b[

i+1]

];最後從f[m]中找乙個最小值就行了,但還要滿足不在一起的條件

ac**如下:

#includeusing namespace std;

const int maxn(2e2+10);

const int inf=0x3f3f3f3f;

int a[maxn][maxn],b[1010],f[1010][maxn][maxn],n,m,ans=inf;

int dp()

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

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

}int main()

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...