状态压缩dp
蒙德里安的梦想
解法:
数据很小,所以这题我们可以考虑状压dp。我们考虑一种解法。先放横着的1 x 2方格 然后再用2 x 1 方格将空处填满。则状态dp[i][j]为前i-1列已经排好,且第i-1列插入的1 x 2 小方格的状态为j,此时第i行状态为j的情况的所有合法数。设dp[i-1][k]为可以转移到dp[i][j]的状态。当状态j合法的时候,集中连续的空格应该为偶数个,即j中连续的0应为偶数个。
dp[i-1][k]中k合法的条件。
- j,k中所插入方格不在同一行,即j,K无交集 -> j&k==0
- i列j状态的连续空格被i-i列中k状态中延伸出来到i行的方格占据后连续的空方格仍然是偶数个 -> j|k 状态合法 -> j|k 中连续的空格的个数为偶数。
code
1 |
|
此处进行了一个优化,即提前将合法状态求出。所需要注意的是,优化步骤不可在大循环外一次性更行到1<<12。每个案例中的n,m不同,则可转移状态也不相同,所以依靠n,m来求出合法状态。
最短Hamilton路径
解法:
将路径的选择压缩成二进制数。dp数组dp[i][j]则表示,到达路径i时是状态j的最小值,j为经过的路径的状态压缩。设k,i中有一条路径,则dp[i][j]=min(dp[i][j],dp[k][m]+value[k][i])。第k个点的状态m合法需满足以下条件。
- 状态m为已经到了k所以m中须有路径k,但是此时未到达i所以m中不可有路径i。状态j中,因为已经到达了点i,且经过点k所以状态j中须有路径i、k。
- j去除点i后还需要有点k -> j-(1<>K&1 == 1
code:
1 |
|