当前位置: 首页 > web >正文

状态压缩DP:蒙德里安的梦想

 

 

Dp

状态表示

f(i,j)

化零心的为整体的

化零为整

集合前i-1列已经摆好,且从第i-1列伸出到第i列的状态是j行的所有方案,j使用十进制表示二进制
属性

状态计算

(划分)

化整体的为零星的

化整为零

划分

先放横着的,再放竖着的

看枚举最后一步哪些行是放了1*2的方格,

假设用k表示最后  从第i-1列伸出到第i列的状态是k,那j能作为一种方案的条件是(j&k)==0,

第二个就是说前i-1列空着的小方块必须要能被竖着的小方块塞满,那么意味着第i-1列连续空着的位置长度必须是偶数。最后的答案为f(m,0)

 所有方案数量等于拜访横着的方格的所有方案数量

#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>using namespace std;typedef long long LL;const int N = 12, M = 1 << N;int n, m;
LL f[N][M];
vector<int> state[M];
bool st[M];int main()
{while (cin >> n >> m, n || m){for (int i = 0; i < 1 << n; i ++ ){int cnt = 0;bool is_valid = true;for (int j = 0; j < n; j ++ )if (i >> j & 1){if (cnt & 1){is_valid = false;break;}cnt = 0;}else cnt ++ ;if (cnt & 1) is_valid = false;st[i] = is_valid;}for (int i = 0; i < 1 << n; i ++ ){state[i].clear();for (int j = 0; j < 1 << n; j ++ )if ((i & j) == 0 && st[i | j])state[i].push_back(j);}memset(f, 0, sizeof f);f[0][0] = 1;for (int i = 1; i <= m; i ++ )for (int j = 0; j < 1 << n; j ++ )for (auto k : state[j])f[i][j] += f[i - 1][k];cout << f[m][0] << endl;}return 0;
}

http://www.xdnf.cn/news/2245.html

相关文章:

  • 极简桌面app官网版下载 极简桌面最新版 安装包下载
  • 导览项目KD-Tree最近地点搜索优化
  • Java集合复习题目
  • 【matlab】绘制maxENT模型的ROC曲线和omission curve
  • 基于 IPMI + Kickstart + Jenkins 的 OS 自动化安装
  • 如何监控和分析MySQL数据库的性能?
  • 指针遍历数组
  • 如何控制DeepSeek的输出内容之AI时代的流量入口GEO
  • JavaScript基础-运算符的分类
  • HiSpark Studio如何使用Trae(Marscode)插件
  • SpringBoot 常用注解通俗解释
  • puppeteer注入浏览器指纹过CDP
  • linux blueZ 第五篇:高阶优化与性能调优——蓝牙吞吐、延迟与功耗全攻略
  • 详解 Network.framework:iOS 网络开发的新基石
  • Spring进阶篇
  • Java面试高频问题(29-30)
  • 解释PyTorch中的广播机制
  • 如何在 Ubuntu 22.04|20.04|18.04 上安装 PostGIS
  • Docker 学习入门篇:镜像构建、推送与私有仓库搭建全攻略
  • JAVA JVM面试题
  • MQ消息的不可靠性发生情况与解决方案
  • Goland终端PowerShell命令失效
  • YOLOv5修改检测框颜色,粗细,标签大小,标签名称
  • 提示词的神奇魔力——如何通过它改变AI的输出
  • 7.Geometric Intersection: Interval
  • [实战] 卡尔曼滤波:原理、推导与卫星导航应用仿真(完整代码)
  • 若干查找算法
  • Vue3 组件通信与插槽
  • 未雨绸缪:应对软件开发变更的生存之道
  • 23种设计模式-行为型模式之观察者模式(Java版本)