農夫約翰最近決定來美化他的花園,他需要運輸很多的泥土。花園是由n塊花圃組成的。第i塊花圃初始的時候有ai數量的泥土。為了達到美化的目的,必須使得第i塊花圃的泥土數量ai變成bi。
約翰有三個選擇:第一,他可以買乙個單位的泥土放進任意花圃中,代價是x;第二,他可以將乙個單位的泥土從某乙個花圃中除去,代價是y;第三,他可以將第i塊花圃中的乙個單位的泥土搬運到第j塊花圃中,大家是z*|i-j|。
問題描述
請幫助約翰計算為了達到目的最小需要花費的代價。
資料範圍:1<=n<=100,0<=ai,bi<=10,0<=x,y,z<=1000
4 100 200 1 210
1 4
2 3
3 2
4 0
發現a[i],b[i]都很小,於是想到可以把每一塊花圃拆開來。如樣例可拆成:1223334444和111122233。於是問題就轉換成了與編輯字元距離類似的問題,但與編輯字元距離又有一點不同:這裡是移動字元然後轉換成需要的字元,而後者是直接轉換。
定乙個f[i,j]表示已經把原串從1-i的部分和目標串1-j的部分編輯成相同的
在把原串轉換成目標串的過程中有三種操作:
1.插入乙個字元:【】:f[i,j]=f[i,j-1]+x:【】:f[i,j-1]表示原串1——i部分與目標串1——j-1部分相同,此時要使原串1——i與目標串1——j部分相同,就應插入乙個字元,付出代價為x
2.刪除乙個字元 f[i,j]=f[i-1,j]+y
3.移動乙個字元並轉換成任意字元 f[i,j]=f[i-1,j-1]+z*abs(a[i]-b[j]) a即原串,b即目標串
初始化:
當原串為空時,需插入與目標串長度相同的字元,代價為i*x
當目標串為空時,需刪去與原串長度相同的字元,代價為i*y時間
複雜度o
(ai∗
bi∗n
2)另一種思路:f[i][j]表示前i塊花圃多了j塊泥土,當然j可以是負數,比如-2就表示他少了2塊.f[i+1][k]=f[i][j]+j*z+cost ,cost=k-j-(a[i]-b[i])多了賣掉,少了買進(僅供參考,未經編寫)
var
n,x,y,z,i,j,k,e,s,t,ans:longint;
f:array[0..1000,0..1000]of longint;
a,b:array[1..1000]of longint;
function
min(a,b,c:longint):longint;
begin
if bthen a:=b;
if cthen a:=c;
exit(a);
end;
begin
readln(n,x,y,z);
for i:=1
to n do
begin
readln(s,t);
for j:=1
to s do
begin
inc(k);
a[k]:=i;
end;
for j:=1
to t do
begin
inc(e);
b[e]:=i;
end;
end;
for i:=0
to e do
f[0,i]:=i*x;
for i:=1
to k do
f[i,0]:=i*y;
for i:=1
to k do
for j:=1
to e do
begin
f[i,j]:=min(f[i-1,j]+y,f[i,j-1]+x,f[i-1,j-1]+z*abs(a[i]-b[j]));
end;
writeln(f[k,e]);
end.
人臉美化隨筆2 美化演算法總結
想要站在巨人的肩膀上,首先要找的巨人。我可能是屬狗熊的,在玉公尺地裡掰乙個扔乙個,走到最後發現手裡神馬也木有。最近終於決定做乙個現代化的狗熊,將這些玉公尺串起來打包帶走,雖然並不知道這和現代化有神馬關係,但是這不重要。重要的是!我的行動硬碟壞了,所有資料瞬間清空,所以我發現硬體略不靠譜啊,寫在網上的...
MFC 學習之 介面美化 2
1 更改圖示 將icon圖示複製到資源檔案中,載入工程,設定id。在對話方塊建構函式中,修改icon的id。2 直接換膚 skinshape工具的skinh.dll skinh.ib skinh.she skinh.h 均拷貝到工程目錄下。stdafx.h 中新增 include skinh.h p...
yii2 url 美化引數
所謂的url引數美化就是將冗長的字串 進行正則替換 yii2 框架的url引數美化完成需要完成兩個階段 第乙個階段分apache和nginx 兩種的配置 apache 1.1 必須開啟rewrite 模式 http.conf 中 loadmodule rewrite module modules m...