題意簡述:乙個公司有三個移動服務員。如果某個地方有乙個請求,某個員工必須趕到那個地方去(那個地方沒有其他員工),某一時刻只有乙個員工能移動。被請求後,他才能移動,不允許在同樣的位置出現兩個員工。從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做法 我們其實...