TVYJ1061 解題報告(線性DP)

2021-09-11 01:58:43 字數 1655 閱讀 8663

題意簡述:乙個公司有三個移動服務員。如果某個地方有乙個請求,某個員工必須趕到那個地方去(那個地方沒有其他員工),某一時刻只有乙個員工能移動。被請求後,他才能移動,不允許在同樣的位置出現兩個員工。從p到q移動乙個員工,需要花費c(p,q)。這個函式沒有必要對稱,但是c(p,p)=0。公司必須滿足所有的請求。目標是最小化公司花費。

輸入格式:第一行有兩個整數l,n(3<=l<=200, 1<=n<=1000)。l是位置數;n是請求數。每個位置從1到l編號。下l行每行包含l個非負整數。第i+1行的第j個數表示c(i,j) ,並且它小於2000。最後一行包含n個數,是請求列表。一開始三個服務員分別在位置1,2,3。

輸出格式:乙個數m,表示最小服務花費。

輸入樣例:

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

輸出樣例:

解題思路:首先要找「階段」,這裡階段很明顯是「已經完成的請求數量」,而我們可以通過轉移乙個業務員,將把「完成i-1個請求」轉移到「完成 i 個請求」。於是狀態與狀態轉移方程大體有思路了。

如果用f( i , x , y , z)來表示已經完成 i 個請求,此時三個業務員分別在x y z 位置,那麼顯然空間和時間都不允許。然後我們可以發現已完成 i 個請求後,必有乙個業務員在 pi 位置上,於是可以將4個引數變成3個,f(i ,x ,y)表示已經完成 i 個請求,且乙個業務員在pi位置上,另外兩個分別在x、y位置上。

如此一來f[i + 1, x , y] = min( f[i + 1, x , y] , f[i , x , y] + c(pi, pi + 1) )

f[i + 1, z , y] = min( f[i + 1, z , y] , f[i , x , y] + c(x, pi + 1) )

f[i + 1, x , z] = min( f[i + 1, x , z] , f[i , x , y] + c(y, pi + 1) )

**示例:

#include#include#includeusing namespace std;

const int maxn = 210;

const int inf = 0x3f3f3f3f;

int c[maxn][maxn];

int f[2][maxn][maxn];

int p[1100];

int solve(int l,int n)

}} }

int ans = inf;

for(int x = 1;x <= l;x++)

for(int y = 1;y <= l;y++)

ans = min(ans,f[n&1][x][y]);

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

int main()

return 0;

}

pku1061青蛙的約會 解題報告

兩隻青蛙跳了t 步 a的座標 x mt b的座標 y nt 相遇的充要條件 x mt y nt pl p是整數 即 n m t lp x y l 0 問題轉化為 求滿足 m n t lp y x 的最小 t t 0 即求 一次同餘方程 m n t y x mod l 的最小正整數解 include ...

CF915D 解題報告

此題目洛谷評分錯誤,根本沒有紫題難度。最開始的想法 列舉刪除的每一條邊,做一遍拓撲排序,最後直接暴力得出答案。但是,仔細分析時間複雜度 o m n m 根本過不去,所以想優化。我們可以發現,當有 x 條邊是指向 u 時,我們在上面的演算法流程中就會把每一條邊都列舉一次,列舉 x 次。但仔細想想,對於...

動態規劃專題 解題報告 D

我們先來想想n2 怎麼做,兩個n2 迴圈乙個求以i結尾的最長上公升子串行,另乙個逆序求一遍,然後列舉i,以i為中間點的長度,迴圈更新結果就有了。是不是很簡單,恭喜你tle。想都不用想必t好嗎?沒有個nlogn演算法怎麼在1e6的資料範圍面前找場子?nlo gn nlogn nlog n做法 我們其實...