SHOI2007 書櫃的尺寸

2022-05-31 02:06:07 字數 1038 閱讀 5994

如果我們直接定義狀態:

\(dp[i][t1][t2][t3][h1][h2][h3]\)表示前i個,第一層寬度為t1,,第二層寬度為t2,第三層寬度為t3,第一層高度為h1,第二層高度為h2,第三層高度為h3的最小面積。

如果直接這樣定義,你會發現,你不僅記憶體炸飛,時間也會t的飛起。

考慮優化狀態。

1.首先,你會發現,面積可以直接用t1,t2,t3,h1,h2,h3算出來,所以我們不妨砍掉一維

2.列一波狀態轉移方程,你會發現,i只會從i-1轉移過來,於是又可以把第一維滾動

3.不難發現,\(t1+t2+t3=\sum _^ t_j\)於是只用知道t1,t2,t3中的任意兩個,就可以推出第三個

那麼,狀態就優化成了:\(dp[0/1][t1][t2][h1][h2]\)表示前i個,第一層寬度為t1,,第二層寬度為t2,第一層高度為h1,第二層高度為h2,的第三層最小高度。

然後,你又會發現,記憶體和時間依舊承受不住。。。

仔細琢磨一下,不難觀察到,每一層的高度是這一層中所放書本的最大值,那麼如果按照一定順序插入書本,高度不就可以省略掉了嗎?

因此,我們先把書本按高度從大到小排個序,這樣每層的高度就是第一次插入到這層書的高度,於是狀態又優化成了:\(dp[0/1][t1][t2]\)表示前i個,第一層寬度為t1,第二層寬度為t2,的最小三層總高度

轉移的話就不用多說了吧。。。

**:注意一點,每層至少得有1本書,因此最後算面積時要排除某一層沒有書的情況。(第二組樣例已經良心地說明了這點)

#includeusing namespace std;

int n,dp[2][2110][2110],sum[101],ans=(1<<30);

struct nodea[1010];

bool cmp(node a,node b)

int main()

} }for(int i=1;i<=sum[n];i++)

} cout

}

SHOI2007 書櫃的尺寸

有一些書放到三層書架上,滿足每層至少一本,最小化 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 這資料範圍誰會想到這麼暴力啊 顯然動態規劃,由於高度最值放下標不...

SHOI2007 善意的投票

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

SHOI 2007 善意的投票

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