有一些書放到三層書架上,滿足每層至少一本,最小化
\[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.將朋友之間連邊 割掉這樣一條邊的含義是 這兩個人產生了衝突 求解這個圖的最...