演算法學習之路|狀態壓縮dp
動態規劃的題目中,狀態的表示是解題的關鍵,。在一些dp問題中,狀態可能會非常複雜,導致用來儲存狀態的dp陣列會有很多維。為此,我們需要用過狀態壓縮來達到減少狀態維數的目的。在狀態壓縮dp中,靈活運用位運算是一項必不可少的要求。
下面舉個簡單的例子說明怎樣縮減dp陣列維數:
有一個n*m的棋盤,上面放著一些棋子,如果用1表示座標為(i.j)的位置有棋子,0表示沒有。按照正常思路,我們會用一個二維陣列ai儲存每一個格子的資訊。但是此時我們可以看到,這個二維陣列是由0和1組成的,每一行(或列)都可以看成一個二進位制數。因此,我們可以用一個一維陣列儲存每一行(或列)的和棋子資訊等價的二進位制數,這就達到了縮減維數的目的。
一道例題:有一個mn的棋盤,在上面放12的小方塊,要鋪滿整個棋盤,求有多少種鋪法。(由於找不到原題,不清楚能否ac)
詳見程式碼
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#define mod 1000000007
using namespace std;
int dp[34][10005];
//dp[i][state]表示該填充第i行,第i-1行對它的影響是state的時候的方法數
int n,m;
void dfs(int i,int j,int pre,int nex)//i為進行到第i行,j表示進行到第i行的第j個,pre表示上一行對這一行的影響,nex表示這一行對下一行的影響
{
if(j==n)
{
dp[i+1][nex]+=dp[i][pre];//當前行查詢完畢時,更新dp陣列的值,即表示i+1行狀態的個數是第i行狀態數的總和,此句是dp陣列更新的關鍵
return;
}
//如果當前位置已經被上一行佔用
if(((1<<(n-j-1))&pre)>0)//位運算的體現
dfs(i,j+1,pre,nex);
//如果當前位置空下,嘗試豎放方塊
if(((1<<(n-j-1))&pre)==0)
dfs(i,j+1,pre,nex|(1<<(n-j-1)));//把nex中第n-j位變為1
//如果當前位為空且後一位也空,橫放方塊
if(j+1<n&&((1<<(n-j-1))&pre)==0&&((1<<(n-j))&pre)==0)
dfs(i,j+2,pre,nex);
//以當前位為基準時,1*2小方塊的放法只有橫放在右邊或者豎放在下邊,因為往上和往左的情況已經被之前的搜尋找到過了
return;
}
int main()
{
while (cin>>n>>m)
{
memset(dp,0,sizeof(dp));
if (n==0&&m==0) break;
dp[1][0]=1;//一開始自然自有一種狀態且不受上一行影響
for (int i=1;i<=m;i++)
{
for (int j=0;j<(1<<n);j++)
if (dp[i][j])//如果此種狀態可行
{
dfs(i,0,j,0);
}
}
cout<<dp[m+1][0]<<endl;
}
}
相關文章
- NOIP2005過河[DP 狀態壓縮]
- URAL 1152 False Mirrors(簡單的狀態壓縮dp)False
- 動態規劃——用二進位制表示集合的狀態壓縮DP動態規劃
- UVA 11825 dp、狀態壓縮、二進位制法表示集合
- 狀壓 dp
- 狀壓DP
- hdu3001 狀態壓縮dp+三進位制
- 論文閱讀 狀態壓縮
- POJ3279 Fliptile【狀態壓縮+DFS】
- 狀態壓縮動態規劃 -- 炮兵陣地動態規劃
- 動態規劃演算法(DP)學習<1>動態規劃演算法
- HDU 5339 Untitled (狀態壓縮列舉)
- 深度學習影象視訊壓縮演算法——TNG深度學習演算法
- 演算法學習之路|強連通分量+縮點演算法
- 動態規劃中初識狀態壓縮(入門)動態規劃
- hdu1074動態規劃狀態壓縮動態規劃
- 2014上海網路賽1004||hdu5045 contest【狀態壓縮dp】
- 狀壓DP基礎入門
- ACM-ICPC 2018 南京賽區網路預賽__E AC Challenge【狀態壓縮+DP】ACM
- 演算法學習之路|POJ-2479最大子串和(簡單dp)演算法
- OceanBase學習之路14|體驗並行匯入 & 資料壓縮並行
- 合理安排(狀壓dp,包括技巧)
- 啃論文俱樂部 | 壓縮演算法團隊:我們是如何開展對壓縮演算法的學習研究演算法
- 深度學習模型壓縮方法概述深度學習模型
- 圖片壓縮知識梳理(0) 圖片壓縮學習計劃
- E - Remove Pairs(狀壓dp+博弈論)REMAI
- 演算法學習之路|划拳演算法
- Uva-1633 Dyslexic Gollum(狀壓DP)Go
- HDU 5067 Harry And Dig Machine(狀壓dp)Mac
- 深度學習之圖片壓縮技術深度學習
- 深度學習影象視訊壓縮技術深度學習
- 演算法學習之路|A除以B演算法
- 演算法學習之路|列印排名演算法
- 演算法學習之路|方格分割演算法
- 演算法學習之路|朋友數演算法
- 演算法學習之路|SpellItRight演算法
- 演算法學習之路|歐幾里得遊戲演算法遊戲
- 演算法學習之路|月餅演算法