最近學習了狀壓dp,既然是dp和其他的dp思想是一致的都是找到轉移方程轉移方法然後轉移就行。不同的在於狀壓dp利用了二進位制把乙個狀態記錄成乙個二進位制數。由於過去dp練習的多,刷一兩道題直接算是入門了。
下面上兩道洛谷的入門狀壓dp:
題意:給定乙個01矩陣,要求找出內部包含的滿足沒有相鄰1的方案數為多少。
思路:n和m的大小為12.故每一行的二進位制狀態大小就是2的12次方 也就是4000左右。每一行的每乙個狀態我們都可以用上一行滿足條件的狀態轉移過來。最多12行。故這題可以用複雜度為2的24次方乘12的複雜度算出來。內部有大量條件不合法稍微減點枝,這個大小是綽綽有餘的。具體細節我的**有注釋。
#include using namespace std;
typedef long long ll;
int n,m;
ll dp[15][(1<<15)];
int a[15][15];
int f[(1<<15)];
int mod = (int)1e8;
int check(int r,int num)
return 1;
}int main()
}int maxn = 1《題意:給定乙個n*n的棋盤。在上面放k個王。滿足這k個王無法相互攻擊。王可以攻擊他相鄰的8個格仔。
#include using namespace std;
typedef long long ll;
int n,k;
int f[(1<<10)];
ll dp[10][(1<<10)][100];
int check(int a,int b)
int main()
for(int cnt = 0;cnt <= k;cnt++)}}
}ll ans = 0;
for(int i=0;i多多接觸一下新演算法有好處的。演算法使用的思想對自己思考別型別的題面也是一種提公升。以前忽視了這個重要性真是血馬虧。
對狀壓dp的一點理解
博主是初學者,以下僅代表個人觀點,若有錯誤歡迎指出。狀壓dp 此dp可以理解為最暴力的dp,因為他需要遍歷每個狀態,所以將會出現2 n的情況數量,所以明顯的標誌就是資料不能太多 好像是 16?然後遍歷所有狀態的姿勢就是用二進位制來表示,01串,1表示使用,0表示未使用,就把所有的狀態投射到很多二進位...
對狀壓dp的見解
看了好幾篇部落格,終於對一些簡單的狀壓dp有了點了解。就像hdu1074。有個部落格 感覺淺顯易懂,但是就是看不出來,然後就是打表 打表 最左邊的一列1 7是 s 1 1 3 的每一種狀態,s是每一塊的第一行,然後 i 0 n 1 temp 1 i 列舉 每一位的1 也就是每一塊的第二行 第三行是 ...
對動態規劃(dp)的一點理解
暑假實驗室搞集訓,實驗室安排我們幾個大二的 準大三 學長分別講點東西。我就被分到講dp 忽然發現,搞acm也有1年多了,好像都沒有好好的總結一下dp。就想說說我自己對dp的理解。dp其實是一種思想,而不是一種演算法。它的核心就是一空間換時間。通過對所有狀態的最優解的記錄,再通過某種遞推關係,得到最終...