首先貼兩個狀態壓縮的題解,這是第乙個狀態壓縮dp,想了一下午,不知道是不是有點慢····
然後在貼下我自己的**
#include
#include
#include
#include
#include
#include
#include
#include
#define ll __int64
#define max 1000009
using namespace std;
/*題意:給你n門功課,每門功課的截止時間和需要完成的天數,沒超過截止時間一天,失去分數+1,問你如何排列做作業順序的情況下,失去分數最小
分析:一共有n!情況,假設 n = 3的時候1 2 3,1 3 2,2 1 3,2 3 1,3 1 2,3 2 1 這些完成他們消耗的天數是一定的,只是完成順序不同,所以扣得分數
也是不一樣,這樣我們就發現了狀態,我們把完成相同的作業數看成一種狀態,在該狀態下,只是功課排列順序不同,我們求出扣分最小的那一組
這樣,我們就來寫下狀態壓縮dp
dp[s] 表示 s狀態下失去的最小分數
我們只需要列舉所有作業的情況就可以把狀態求出來
我們怎麼表示每個作業的完成情況呢?
二進位制!位運算
例如 5 101 代表第一,第三門功課完成
假設功課k,狀態i 我們怎麼得出dp[i]呢,dp[i]由未完成k的dp[i]推出完成k的dp[i]
狀態j = i-(1<>a[i].name>>a[i].endd>>a[i].use;
int bit = 1<=0; j--)}}
}stacks;
int tem = bit - 1;
cout while(!s.empty()) }return 0; } 很明顯的狀態壓縮題目。當然了如果他的意識只有是求最小值沒有要求輸出那個輸出的順序,那麼直接用揹包,甚至是貪心都是可以做出來的,但是要求順序這個揹包的話沒有辦法吧資料記錄下來。所以用二進位制壓縮。所謂的二進位制壓縮就是用二進位制來表示事情的完成程度和狀況,比如1,就是0000001表示第乙個作業做了,... 我們可以斷定狀態的終止態一定是n個數全部選完的情況,那麼它的前乙個狀態是什麼呢,一定是剔除任一門課程後的n種狀態。例如dp 全選了 min那麼接下來的dp狀態依然如此。好了,接下來,我們該如何去思考了,這個題目共有2 15種可能情況,對此我們通過位運算的方法降低它的維度。二進位制的每一位代表一門課,... 題目描述 有 n 門課程的作業,每門都有完成期限d,與完成所需時間c,若超過期限,1天扣1分。問完成這n門作業至少要扣多少分,並輸出扣分最少的做作業順序。思路 dp i 記錄完成狀態為i的情況下的資訊。完成所需時間,上乙個狀態,最小扣分 狀態方程 dp i min dp j cost j,i 從j狀...hdu1074狀態壓縮
hdu 1074 狀態壓縮
hdu 1074 狀態壓縮dp