状态压缩dp
作者:
一片竹林
,
2024-04-02 15:52:59
,
所有人可见
,
阅读 31
基本的
状态压缩 空间小 结果大 一般要开long long
表示第i位是否为 1
state>>i &1
第i+1 位
state>>i+1 &1
依次类推
**判断是否有相邻的1 取出每一位的1 看i+1位是否为1
比较保险 其他判断方法 容易因为运算顺序得到结果错误**
表示 第i+1位(从1位开始计数的话) 加上1
state+=1<<i;
2的n次方
1<<n;
滚动数组
g[i &1] 当计算数量的时候 记得把当前清空
计算二进制中有几个1 好处是不用循环-不用知道位数
int res=0;
while(state)
{
res++;
state-=state&-state;
}
return res;
一般情况下 dp数组的定义
有个数限制 只考虑前1行 无个数限制直接舍去第二维就行
dp[N][K][S];
表示 前N行中 摆了 K个 第N行状态为S
转移方程只考虑和前一行
dp[i][j][b]=dp[i][j][b]+dp[i-1][j-get_count(b)][a];
无个数限制 但考虑前2行
dp[N][M][M];
前n行 i-1的状态 i-2行的状态
从 前 n-1行 i-2 行 i-1 行 这样的状态转移