乙個公司有三個移動服務員,最初分別在位置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...