這裡科目最大數目才15, 只要有全列舉的思想來dp就可以解決了, 有乙個專有名詞叫狀態壓縮dp. 狀態壓縮dp採用二制進的思想,
1, 0分別代表有或否.
如: 3的二進位制為 11, 則代表完成了每一,二個科目的狀態, 101代表完成了第一三兩個科目的狀態.
這樣, 可以從0->(1 << n)來獲取所有狀態, 並進行適當的狀態轉移. 對該題來說 d[s]代表集合s的狀態, 要得到d[s]的狀態, 可以從0 - n 分別檢查是否在s集合內[s & (1 << i) > 0則表示i在集合s上,反之..], 如果i在s集合內, 剛d[s]可從d[s-]來獲得, [s-,可以s - (1<
ac**如下:
#include #include #include #include #include using namespace std;
#define max 1<<16
#define maxscore 0x7fffffff
struct homeworkhw[16];
struct dptdp[1<<16];
int main()
int endstate = 1 << n;
// memset( dp, 0, sizeof( dp ) );
for( int i = 1; i < ( 1 << n ); i++ )
if( reduce + dp[past].score < dp[i].score )}}
} stackq;
int i = endstate - 1;
cout << dp[i].score << endl;
while( i )
while( !q.empty() )
} return 0;
}
二進位制狀態壓縮
二進位制狀態壓縮,即將乙個長度為m的bool陣列用乙個m位的二進位制數來表示和儲存 操作運算 取出整數n在二進位制表示下的第k位 n k 1 取出整數n在二進位制表示下的第0 k 1位 後 k 位 n 1 取出整數n在二進位制表示下的第k位取反 n xor 1 取出整數n在二進位制表示下的第k位賦值...
二進位制 二進位制起源
現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...
Sleep Buddies (二進位制狀態壓縮)
演算法 狀態壓縮,把每乙個集合都壓縮成乙個數字。使用方法 把每個狀態都進行1 ac code 1 include 2 using namespace std 3 typedef long long ll 4 const int maxn 1e5 10 5 define rep i,first,las...