OSDN Git Service

Update state.md
authorMosa-Linking <42469018+Mosa-Linking@users.noreply.github.com>
Sun, 19 Aug 2018 13:19:28 +0000 (21:19 +0800)
committerGitHub <noreply@github.com>
Sun, 19 Aug 2018 13:19:28 +0000 (21:19 +0800)
docs/dp/state.md

index e69de29..fbbe2da 100644 (file)
@@ -0,0 +1,39 @@
+学习状压dp之前,请确认你已经完成了[动态规划初步](https://oi-wiki.cf/dp/)部分内容的学习\r
+\r
+(建议学习[位运算](https://oi-wiki.cf/math/bit/)部分的内容)\r
+\r
+### 状压dp简介\r
+状压dp是动态规划的一种,借由将状态压缩(通常压缩为某整形)以达到节约空间和时间的目的\r
+\r
+#### 常用格式\r
+\r
+```cpp\r
+int maxn=1<<n; //规定状态的上界\r
+for (int i=0;i<maxn;i++){\r
+       if (i&(i<<1)) continue;//如果i情况不成立就忽略\r
+       Type[++top]=i;//记录情况i到Type数组中\r
+}\r
+for (int i=1;i<=top;i++){\r
+       if (fit(situation[1],Type[i]))\r
+       dp[1][Type[i]]=1;//初始化第一层\r
+}\r
+for (int i=2;i<=层数(dp上界);i++){\r
+       for (int l=1;l<=top;l++)//穷举本层情况\r
+       for (int j=1;j<=top;j++)//穷举上一层情况(上一层对本层有影响时)\r
+               if (situation[i],Type[l]和Type[j]符合题意)\r
+               dp[i][l]=dp[i][l]+dp[i-1][j];//改变当前层(i)的状态(l)的方案种数\r
+}\r
+for (int i=1;i<=top;i++) ans+=dp[上界][Type[i]];\r
+```\r
+\r
+#### 典型例题\r
+\r
+[[USACO06NOV]玉米田Corn Fields](https://www.luogu.org/problemnew/show/P1879)\r
+\r
+显然,这是一道典型的动态规划题目,但由于方案数过多,应使用状压dp避免超时\r
+\r
+本题所"压缩"的是"每行可行的状态"和"每行土地的状态",而储存答案的dp数组就应同时体现这两个特点(所以本题dp数组为二维)\r
+\r
+具体实现方法同上方伪代码\r
+\r
+[例题代码](https://www.luogu.org/paste/kto3ua68)\r