SHOI2007 書櫃的尺寸

2022-03-16 23:58:20 字數 1006 閱讀 4786

有一些書放到三層書架上,滿足每層至少一本,最小化

\[s=\left(\sum_^3 \max_ h_i\right) \times \left(\max_^3 \sum_ t_i\right)

\]其中\(n \leq 70,h_i \leq 300,t_i \leq 30\)

這資料範圍誰會想到這麼暴力啊

顯然動態規劃,由於高度最值放下標不會做,所以將寬度和放在下標

設\(f_\)表示選了前\(i\)本書,第一層寬度\(j\),第二層寬度\(k\)時的最小高度,即最小化\(f_*max(j,k,n-j-k)\)

\(,\)

\((j,k \geq 1\) 且 \(j+k < n)\),注意每一層必須要有書

由於沒有記錄高度最值,所以不能轉移;將高度從大到小排序即可,一層加入的第一本書一定是最高的

時間上可能過不了(不然為什麼開\(5s\)的時限),將每次\(dp\)的\(sum\)寬度設為前\(i\)本書的寬度和即可將\(n*2100^2\)的複雜度優化至玄學

#include#define n 2101

#define re register

#define min(x,y) ((x)<(y)?(x):(y))

#define max(x,y) ((x)>(y)?(x):(y))

using namespace std;

int n,sum;

int f[2][n][n];

struct node nd[n];

template void read(t &x)

bool cmp(node a,node b)

int main()

} }int ans=2000000000;

for(int i=1;ifor(int j=1;i+jans=min(ans,(long long)max(max(i,j),sum-i-j)*f[now][i][j]);

cout

}

SHOI2007 書櫃的尺寸

如果我們直接定義狀態 dp i t1 t2 t3 h1 h2 h3 表示前i個,第一層寬度為t1,第二層寬度為t2,第三層寬度為t3,第一層高度為h1,第二層高度為h2,第三層高度為h3的最小面積。如果直接這樣定義,你會發現,你不僅記憶體炸飛,時間也會t的飛起。考慮優化狀態。1.首先,你會發現,面積...

SHOI2007 善意的投票

這個題一開始看到資料範圍和只能選0或者1的時候,直接就想到了網路流.可是想到費用流上了。但是之後發現這個題並不能用費用流做。因為雖然代價可以轉化成費用,但是流量並不是可以確定限制的。先把圖轉化成二分圖 s連選0的,1連t。乙個人只能有兩種選擇,選了乙個另外乙個就不需要付出代價了 最小割。我們用流量表...

SHOI 2007 善意的投票

題目鏈結 演算法 首先 選擇睡覺的人和不選擇睡覺的人構成兩個集合 這啟發我們用最小割解決該問題 1.將源點與每個睡覺的人連邊 將每個不睡覺的人與匯點連邊 割掉這樣的一條邊的含義是 有乙個人放棄了睡覺 不睡覺 產生了1衝突 2.將朋友之間連邊 割掉這樣一條邊的含義是 這兩個人產生了衝突 求解這個圖的最...