hdu1074狀態壓縮

2021-06-25 11:42:59 字數 1398 閱讀 5393

很明顯的狀態壓縮題目。當然了如果他的意識只有是求最小值沒有要求輸出那個輸出的順序,那麼直接用揹包,甚至是貪心都是可以做出來的,但是要求順序這個揹包的話沒有辦法吧資料記錄下來。所以用二進位制壓縮。

所謂的二進位制壓縮就是用二進位制來表示事情的完成程度和狀況,比如1,就是0000001表示第乙個作業做了,別的都沒做,101表示1,3做了,別的沒做。。。一直到2^n-1也即是11111111111111111.。。。。表示所有完成而n<=15不是很大完全可以做出來。思想和揹包一樣就是我們對於任何乙個數1<=m.=0)如果我們選擇了作業i那麼作業i就應該做了,也就是相應的位置上m的二進位制數是乙個1,那麼m&2^j就是乙個大於0的數字,這樣我們就可以用m-2^j來推導m的狀態。比如現在m=1110001101而j=3,那麼2^3=1000所以同或以後就是1110000101,也就是在1110000101的基礎上選擇j這個東西,遍歷一遍所有的可以的j值就可以找到最優的情況。這樣到最後111111111111111111111.。。。。就可以全部求出。

最後輸出順序是倒置的所以用遞迴,棧,哪怕是陣列(倒置輸出)也是可以的。這個不是重點就不多講。

#includeusing namespacestd;#include#include#include#includeconst

intinf=99999999;//卡的比較嚴的話還是用0x7fffffff(int最大)比較好

const

intmax=(1<<15)+10;相當於2^15+10;不過速度更快

structhomdp[20];

structhomdp[max];

voidoutput(

intx)

intmain

() }

}}cout<<dp[temp-1].score<<endl;output(temp-1);

}return0;

}

hdu 1074 狀態壓縮

我們可以斷定狀態的終止態一定是n個數全部選完的情況,那麼它的前乙個狀態是什麼呢,一定是剔除任一門課程後的n種狀態。例如dp 全選了 min那麼接下來的dp狀態依然如此。好了,接下來,我們該如何去思考了,這個題目共有2 15種可能情況,對此我們通過位運算的方法降低它的維度。二進位制的每一位代表一門課,...

hdu 1074 狀態壓縮dp

題目描述 有 n 門課程的作業,每門都有完成期限d,與完成所需時間c,若超過期限,1天扣1分。問完成這n門作業至少要扣多少分,並輸出扣分最少的做作業順序。思路 dp i 記錄完成狀態為i的情況下的資訊。完成所需時間,上乙個狀態,最小扣分 狀態方程 dp i min dp j cost j,i 從j狀...

HDU 1074 狀態壓縮dp

起初想到貪心沒思路 看了題解 狀態壓縮dp 最多15個狀態 1,1 include stdio.h include stdlib.h include string.h include algorithm include include define n 1 15 5 define inf 1 30 ...