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

news2025/1/22 9:18:23

蒙德里安的梦想

  • 核心思想: 状态压缩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;
          }
      }
    

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三个故事,谈谈小米汽车技术发布会

都说新年新气象&#xff0c;随着年末消费旺季到来&#xff0c;汽车市场越来越热闹了。 继蔚来12月23日公布旗舰车型ET9&#xff0c;华为26日发布问界M9&#xff0c;小米汽车首款量产车型SU7终于正式亮相。 12月28日&#xff0c;在小米汽车技术发布会上&#xff0c;小米创办人…

Apache Flink连载(二十一):Flink On Yarn运行原理-Yarn Application模式

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录 1. 任务提交命令

SpringBoot 实现Execl 导入导出

1、引包 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>3.0.3</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easy…

基于element-ui table组件的二次封装

文章目录 配置数据基础分析封装 el-table-column使用插槽强化结语 相信 element-ui 大家都有所耳闻&#xff0c;table 也是老朋友了&#xff0c;不过在使用它的时候大家是怎么使用的呢&#xff1f;是直接在官网上cv使用吗&#xff1f;这种方式&#xff0c;我相信写起来会有点小…

[2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件

哈喽大家好&#xff01;你有没有需要适用于电脑的免费数据恢复软件呢&#xff1f;数据丢失可是个烦心事&#xff0c;无论是硬件故障还是软件损坏&#xff0c;甚至是意外删除、格式化或计算机病毒&#xff0c;都让人郁闷至极。当你遇到数据丢失的情况时&#xff0c;你一定希望能…

基于huffman编解码的图像压缩算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 Huffman编码算法步骤 4.2 Huffman编码的数学原理 4.3 基于Huffman编解码的图像压缩 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..…

在Linux上搭建Maven仓库的实战教程

引言 在Java开发中&#xff0c;Maven作为项目构建和依赖管理的重要工具&#xff0c;其仓库的搭建至关重要。本文将手把手教你如何在Linux系统上安装并配置Nexus Repository Manager 3&#xff08;简称Nexus 3&#xff09;&#xff0c;从而创建一个私有的Maven仓库。 步骤一&a…

浅谈水下起重顶升作业使用千斤顶的可能性

并非所有起重顶升的施工环境全为常规环境&#xff0c;除了传统的陆上作业之外&#xff0c;难免也会有一些特殊环境下的起重顶升任务&#xff0c;其中比较典型的自然是水下起重顶升作业&#xff0c;那么千斤顶究竟能在水下进行起重顶升作业吗&#xff1f;接下来成华制造来给大家…

04-获取认证的用户身份信息

存储用户信息的方式 获取用户信息的流程 用户提交账号和密码后,DaoAuthenticationProvider调用UserDetailsService接口实现类的loadUserByUsername()方法,该方法可以接收请求参数username的值,然后根据该值查询用户信息,最后将账号,密码,权限封装到UserDetails对象中并返回给…

I.MX6ULL_Linux_驱动篇(51)linux 音频驱动

音频是我们最常用到的功能&#xff0c;音频也是 linux 和安卓的重点应用场合。 I.MX6ULL 带有 SAI接口&#xff0c;正点原子的 I.MX6ULLALPHA 开发板通过此接口外接了一个 WM8960 音频 DAC 芯片&#xff0c;本章我们就来学习一下如何使能 WM8960 驱动&#xff0c;并且通过 WM89…

flask之文件管理系统-项目 JRP上线啦!!! ---修订版,兼容Windows和Linux系统

上一章的版本https://blog.csdn.net/weixin_44517278/article/details/135275066&#xff0c;在Windows下debug完成无异常后&#xff0c;上传到我的树莓下开始正式服役 由于开发环境是Windows&#xff0c;使用环境是Linux&#xff0c;导致最后没能成功运行起来 这个版本是今天去…

Elasticsearch:升级索引以使用 ELSER 最新的模型

在此 notebook 中&#xff0c;我们将看到有关如何使用 Reindex API 将索引升级到 ELSER 模型 .elser_model_2 的示例。 注意&#xff1a;或者&#xff0c;你也可以通过 update_by_query 来更新索引以使用 ELSER。 在本笔记本中&#xff0c;我们将看到使用 Reindex API 的示例。…

【Linux C 几种锁的性能对比】 1.读写锁 2.互斥锁 3.自旋锁 4.信号量 5.rcu

直接上代码 rcu.c #include <stdio.h> #include <stdlib.h> #include <unistd.h>#include <pthread.h> #include <limits.h> #include <semaphore.h> #include <urcu.h>/* 1.读写锁2.互斥锁3.自旋锁4.信号量5.rcu */#define RW_LOC…

基于 Linux 的批量上传本地 Git 仓库到 Github 的实践

基于 Linux 的批量上传本地 Git 仓库到 Github 的实践 一、需求二、上传本地 Git 仓库2.1 初始版本2.2 优化版本 三、 GitHub 创建空仓库3.1 初始版本3.2 优化版本 四、Gitee 创建空仓库 一、需求 app目录下的每个文件夹都是一个git仓库&#xff0c;如何使用shell脚本将所有gi…

Python/R/GUI/BI类型常用数据可视化工具

什么是数据可视化工具&#xff1f; 数据可视化工具是指旨在可视化数据的所有形式的软件。它们处理数据输入&#xff0c;将其转换为用户可以根据自己的需求进行定制的视觉效果。 不同的工具可以包含不同的功能&#xff0c;但最基本的是&#xff0c;数据可视化工具提供输入数据集…

交叉编译含义

交叉编译是在一个平台上生成另一个平台上的可执行代码。同一个体系结构可以运行不同的操作系统&#xff1b;同样&#xff0c;同一个操作系统也可以在不同的体系结构上运行。 编译工具链下载&#xff1a; (1) ARM提供&#xff1a;Arm GNU Toolchain Downloads – Arm Develope…

GroundingDINO-根据文本提示检测任意目标

1. 背景介绍 GroundingDINO是一种新的SOTA零样本物体检测模型。在这篇文章中&#xff0c;我们将讨论Grounding DINO模型的优势&#xff0c;分析其具体的模型架构&#xff0c;并提供真实的测试样例。 闲话少说&#xff0c;我们直接开始吧&#xff01; 2.零样本目标检测 大多…

Python实现员工管理系统(Django页面版 ) 七

各位小伙伴们好久不见&#xff0c;2024年即将到来&#xff0c;小编在这里提前祝大家新的一年快快乐乐&#xff0c;能够事业有成&#xff0c;学习顺心&#xff0c;家庭和睦&#xff0c;事事顺利。 今天我们本篇要实现的是一个登录界面的实现&#xff0c;其实登录界面的实现看着挺…

php学习06-魔术常量

有九个魔术常量它们的值随着它们在代码中的位置改变而改变。例如 LINE 的值就依赖于它在脚本中所处的行来决定。这些特殊的常量不区分大小写&#xff0c;如下&#xff1a; 参考