fj有m個牛棚,編號1至m,剛開始所有牛棚都是空的。
fj有n頭牛,編號1至n,這n頭牛按照編號從小到大依次排隊走進牛棚,每一天只有一頭奶牛走進牛棚。第i頭奶牛選擇走進第p[i]個牛棚。
由於奶牛是群體動物,所以每當一頭奶牛x進入牛棚y之後,牛棚y裡的所有奶牛們都會喊一聲「歡迎歡迎,熱烈歡迎」,由於聲音很大,所以產生噪音,產生噪音的大小等於該牛棚裡所有奶牛(包括剛進去的奶牛x在內)的數量。
fj很討厭噪音,所以fj決定最多可以使用k次「清空」操作,每次「清空」操作就是選擇乙個牛棚,把該牛棚裡所有奶牛都清理出去,那些奶牛永遠消失。「清空」操作只能在噪音產生後執行。
現在的問題是:fj應該選擇如何執行「清空」操作,才能使得所有奶牛進入牛棚後所產生的噪音總和最小?
一直以為這道題順序也對答案有關,而只想著以n作為狀態;但這顯然是不可行的。
我們最後關心的是每乙個牛棚清空幾次,在第幾次清空;因此我們可以在輸入之後用桶排的思想對每乙個牛棚進行標記 ; 那麼我們只要對每乙份牛棚進行分別處理即可而不需要以時間為狀態。
我們設f[i
][j]
f[i][j]
f[i][j
]表示前i個牛棚,已經使用了j次清空機會的最小噪音。
則有狀態轉移方程:f[i
][j]
=f[i
−1][
j−k]
+cos
t(a[
i],k
+1
)f[i][j]\ =\ f[i-1][j-k]+cost(a[i],k+1)
f[i][j
]=f[
i−1]
[j−k
]+co
st(a
[i],
k+1)
a[i]表示第i個牛棚中進入牛的數量;cos
t(a,
b)
cost(a,b)
cost(a
,b)表示將有a
aa只牛棚分成b+1
b+1b+
1段的最小噪音。
一定需要平均分,例如將11
1111
分成4
44段就是:2,3
,3,3
2,3,3,3
2,3,3,
3.可以這麼理解:11/4
=2
11/4=2
11/4=2
,因此分成2
22個4
44;而11%4
=3
11\%4=3
11%4=3
,所以有3
33個2
22需要加上1
11.統一,我們轉化到求解cos
t(a,
b)
cost(a,b)
cost(a
,b):一定有一定有a−a
%b
a-a\%b
a−a%
b的數是⌊ab
⌋\lfloor \frac\rfloor
⌊ba
⌋,有a%b
a\%b
a%b個數是⌊ab
+1
⌋\lfloor \frac+1\rfloor
⌊ba+1
⌋,最後用等差數列求和公式即可得到cos
t(a,
b)
cost(a,b)
cost(a
,b).
對於這道題目來說,合理的觀察資料範圍還是十分重要的。
**如下:
#include
using
namespace std;
int n,m;
int t[
301]
;int v[
301]
;long
long c[
301]
;long
long f[
301]
[90001];
void
sort
(void
)return;}
intmain
(void
)for
(int i=
1;i<=n;
++i)
for(
int j=v-
1;j>=0;
--j)
f[i]
[j]=
min(f[i]
[j+1
], f[i]
[j])
;//f[i][j] 表示 前i件物品 價值至少為j的最小代價
for(
int i=
1,t,m;i<=m;
++i)
return0;
}
動態規劃 什麼是動態規劃?
先來看看 資訊學奧賽一本通第5版 是怎麼說的 動態規劃程式設計是對解最優化問題的一種途徑 一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有乙個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,...
mysql動態規劃 動態規劃
動態規劃 能夠動態規劃的問題具有以下特點 可分解成規模更小的子問題 子問題的結果可復用 關鍵是要理解狀態轉移方程的含義就好啦!數字三角形 問題描述 在數字三角形尋找從頂到底的路徑,使得路徑經過的數字之和最大。規定每一步只能往左下或右下走,求出最大路徑和。遞迴解法 include include us...
《動態規劃》 ACM 動態規劃例題詳解
描述 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 圖1 圖1給出了乙個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到乙個和,你的任務就是找到最大的和。注意 路徑上的每一步只能從乙個數走到下一層上和它最近的左邊的那個數或者右邊的那個數。輸...