算法基础之蒙德里安的梦想

蒙德里安的梦想

  • 核心思想: 状态压缩dp

    • 总方案 = 横放的方案 剩下的地方竖着放是固定的了

    • 状态压缩 : 将每一列的图(横终点 横起点 竖) 用一个二进制数存下

      • 向后凸的为1 反之为0
      • 在这里插入图片描述
    • 状态计算: 所有 i – 1 列 不冲突的 都加和

      • f[i , j] = f[i - 1 , k] + …. + …
      • 在这里插入图片描述
    • **不合法状态:**前两种合法 后两种不合法 单个格子不能竖放

      • 在这里插入图片描述
    • 不冲突状态:j & k ==0 没重叠部分j | k 必须是合法的

      • 在这里插入图片描述

朴素版

  •   #include<iostream>
      #include<cstring>
      #include<algorithm>
      
      using namespace std;
      const int N = 12 , M = 1 << N ;  //M为图的最大数 2的N次方
      
      int n,m;
      long long f[N][M];  //开long long的f存
      bool st[M];  //标记该图是否合法
      
      int main()
      {
          while(cin>>n>>m , n || m)  //有输入 且均不为0
          {
              for(int i=0;i< 1 << n ; i++)  //i<2的n次方
                  //一共n行 每个位置两种选择 共2的n次方
              {
                  int cnt = 0;  //记录一张图连续的0有多少个
                  st[i] = true;  //初始i图为true合法的
                  for(int j=0;j<n;j++)  //遍历图中每位数
                  {
                      if(i >> j & 1)  //取i图中第j个数 判断是否为1
                      {  //若为1 则判cnt是奇数偶数
                          if(cnt & 1)  //奇数则说明 图不合法
                          {
                              st[i] = false; //有奇数0 直接false 退出循环
                              break;
                          }
                          cnt = 0 ;  //清空cnt 重新开始
                      }
                      else cnt++;  //若为0 cnt++
                  }
                  if(cnt & 1) st[i] = false;  //判断后段0的个数 没有1 进不去上面的判断 
              }
              
              memset(f,0,sizeof f);  //初始化
              f[0][0] = 1;  //0列 不放方块 方案 = 1
              for(int i=1;i<=m;i++)  //遍历每一列
                  for(int j=0;j< 1 << n; j++)  //每列2的n次方张图
                      for(int k=0;k< 1 << n;k++)  //前一列也是2的n次方张图
                          if((j & k) == 0 && st[j | k])  //不冲突的条件
                              f[i][j] += f[i-1][k];  //计算
              cout<<f[m][0]<<endl;  //输出前m-1列排好序 没有凸出来的方案数
          }
      }
    

优化版

  •   #include<iostream>
      #include<cstring>
      #include<algorithm>
      #include<vector>
      
      using namespace std;
      const int N = 12 , M = 1 << N ;
      
      int n,m;
      long long f[N][M];
      bool st[M];
      vector<vector<int>> state(M);  //用二维数组将与 j 不冲突的k存下 不用去再遍历了
      
      int main()
      {
          while(cin>>n>>m , n || m)
          {
              for(int i=0;i< 1 << n ; i++)
              {
                  int cnt = 0;
                  st[i] = true;
                  for(int j=0;j<n;j++)
                  {
                      if(i >> j & 1)
                      {
                          if(cnt & 1)
                          {
                              st[i] = false;
                              break;
                          }
                          cnt = 0 ;
                      }
                      else cnt++;
                  }
                  if(cnt & 1) st[i] = false;
              }
              
              for(int j=0;j< 1<<n;j++)
              {
                  state[j].clear();  //清空之前的
                  for(int k=0;k< 1<<n;k++)
                  {
                      if((j & k) == 0 && st[j | k])
                          state[j].push_back(k);  //不冲突放里头
                  }
              }
              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;
          }
      }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/279137.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

图像文件怎么才能转换为Excel

将图像文件转换为Excel需要通过OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;技术&#xff0c;先将图片中的文字识别出来&#xff0c;再将识别出的文字导入到Excel中。这可以使用一些在线或离线的OCR工具&#xff0c;例如ABBYY FineReade…

Linux 线程安全 (2)

文章目录 线程同步概念条件变量使用生产消费模型信号量的使用读写锁的使用 Linux 线程安全 &#xff08;1&#xff09; 线程同步概念 竞态条件&#xff1a;因为时序问题&#xff0c;而导致程序异常. 饥饿问题&#xff1a;只使用互相锁保证线程安全时&#xff0c;锁资源总被某…

听说上海移动年终奖16个月!我承认我酸了!

* 你好&#xff0c;我是前端队长&#xff0c;在职场&#xff0c;玩副业&#xff0c;文末有福利! 今天&#xff0c;队长看到一篇帖子&#xff0c;有网友发帖说上海移动的年终奖发了16个月&#xff0c;我承认我酸了。 看到这里&#xff0c;我承认我也酸了。16个月是什么概念&…

案例-旋转的太极图案(HTML+CSS)

使用css的动画变换效果完成“ 旋转太极“。 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>*{margin: 0;padding: 0;background-color: antiquewhite;}.tj{width: 0;height: 300px;/* border…

CEC2017(Python):五种算法(PSO、RFO、SSA、DE、HHO)求解CEC2017

一、5种算法简介 1、粒子群优化算法PSO 2、红狐优化算法RFO 3、麻雀搜索算法SSA 4、差分进化算法DE 5、哈里斯鹰优化算法HHO 二、CEC2017简介 参考文献&#xff1a; [1]Awad, N. H., Ali, M. Z., Liang, J. J., Qu, B. Y., & Suganthan, P. N. (2016). “Problem de…

计算机网络【EPoll原理】

预备知识&#xff1a;内核poll钩子原理 内核函数poll_wait 把当前进程加入到驱动里自定义的等待队列上 &#xff1b; 当驱动事件就绪后&#xff0c;就可以在驱动里自定义的等待队列上唤醒调用poll的进程&#xff1b; 故poll_wait作用&#xff1a;可以让驱动知道事件就绪的时…

蛇目标检测数据集VOC格式100张

蛇是一种广泛分布于地球各个角落的爬行动物&#xff0c;是无脚类爬行动物中最为特殊的一类。它们身体长而细长&#xff0c;通常由许多鳞片组成&#xff0c;没有四肢。蛇生活的环境非常多样&#xff0c;可以在沙漠、森林、草原和水域等各种地方找到它们的踪迹。 蛇是以捕食其他…

VS2013中特殊操作

代码段管理器(查看代码补全快捷方式) 1.点击 工具 ->点击 代码片段管理器->看到 语言->选择 Visual C 2.可以点击下方添加 自定义一个属于自己的快捷代码补全方式 3.结果图&#xff1a; 设置自动换行与行号 1.点击 工具->点击 选项->找到 文本编辑器(然后点击)…

百度地图添加坐标点

​​​​​​html <!DOCTYPE html><html xmlns"http://www.w3.org/1999/xhtml"> <head runat"server"><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>查看签到信息-地图…

[蓝桥杯2022省赛] X 图形

X 图形 问题描述 给定一个字母矩阵。一个 X 图形由中心点和由中心点向四个 4545 度斜线方向引出的直线段组成&#xff0c;四条线段的长度相同&#xff0c;而且四条线段上的字母和中心点的字母相同。 一个 X 图形可以使用三个整数r,c,L 来描述&#xff0c;其中 r,c 表示中心点…

stm32中的i2c协议

stm32中I2C 文章目录 stm32中I2CI2C 协议简介I2C物理层协议层I2C基本读写过程 **通讯的起始和停止信号****数据有效性****地址及数据方向****响应** STM32的I2C特性及架构**STM32** **的** I2C外设简介STM32 的 I 2C 架构剖析通讯引脚 通讯过程主发送器主接收器 I2C初始化结构体…

工程(十六)——自己数据集跑Fast_livo

一、基础环境 Ubuntu20.04 ROS noetic PCL 1.8 Eigen 3.3.4 Sophus git clone https://github.com/strasdat/Sophus.git cd Sophus git checkout a621ff mkdir build && cd build && cmake .. make sudo make install 下面两个直接把包下载下来一起编译…

swing快速入门(三十二)消息对话框

注释很详细&#xff0c;直接上代码 新增内容 1.自定义对话框前列图标 2.消息对话框的若干种形式 package swing21_30;import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent;public class swing_test_30 {// 定义一个JFrameJFrame jFrame new JFram…

React 、Vue进度 条首屏加载制作

React 大家都听说过&#xff0c;是一个非常出名的前端 框架 &#xff0c;目前在公司 用的比较多的两个前端框架 &#xff0c;一个是 React , 一个 是 Vue 2 、3 &#xff0c;公司 的首页 &#xff0c;后台 前端部分 都是 以这两个为主 &#xff0c;做了 不下 数十个 项目 但是 …

大数据背后的绿色收割:基于Hadoop的农产品价格信息智能分析

大数据背后的绿色收割&#xff1a;基于Hadoop的农产品价格信息智能分析 引言正文1. 数据获取与准备2. 数据清洗与处理3. Hadoop数据分析引擎的运用4. MySQL数据库的集成5. 创新性的可视化6. 结论与展望 结语 引言 随着信息技术的不断发展&#xff0c;农业领域也在数字化的浪潮…

【2023年终总结】纵是一路仆仆风尘,也莫忘了仰头

文章目录 1. 写在前面2. 关于生活3. 关于工作4. 关于以后 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感兴趣的朋…

阿里云2核2G3M服务器放几个网站?

阿里云2核2g3m服务器可以放几个网站&#xff1f;12个网站&#xff0c;阿里云服务器网的2核2G服务器上安装了12个网站&#xff0c;甚至还可以更多&#xff0c;具体放几个网站取决于网站的访客数量&#xff0c;像阿里云服务器网aliyunfuwuqi.com小编的网站日访问量都很少&#xf…

三路电源互备自投电路

当供电源停电时&#xff0c;主备用电源自动投入运行&#xff0c;当主备用电源断电时&#xff0c;则次备用电源自动投入运行&#xff0c;从而大大提高供电的可靠性。

基于three.js的室内全景3D展馆案例分享

先看效果图 实现了第一人称行走&#xff0c;WASD点击目标画册进行预览查看位置音乐播放环绕地面镜面反光碰撞检测等等. 地址在gitee上gallery: 数字展馆概念的demo项目&#xff0c;本项目中使用的技术栈为three.js 有兴趣的伙伴可以去下载看看&#xff0c;有这方面的项目应该能…

Python FastApi连接oracle进行查询

这边技术选型是cx_oracle进行连接查询&#xff0c;cx_oracle的使用首先要有官方的客户端才能连接到数据库&#xff0c;python并不自带客户端。我用是Python3.9 安装客户端 可以到官网在选择最新版进行下载。 Instant Client for Microsoft Windows (x64) 64-bit 或者直接从我…