AcWing 1064. 小国王(状态压缩DP)

news2024/9/23 13:26:26

AcWing 1064. 小国王

  • 一、问题
  • 二、思路
    • 1、整体逻辑
    • 2、状态表示
    • 3、状态转移
    • 4、循环设计
    • 5、初末状态
  • 三、代码

一、问题

在这里插入图片描述

二、思路

1、整体逻辑

我们看下面这个例子:
在这里插入图片描述
如果我们一行一行放的话。

在上图中,我们先看第二行,我们发现第二行在哪个位置可以放置国王,完全取决于第一行如何放的。而我们在第二行放了国王后,第二行的国王不仅会影响本层其余国王的放置,还会影响第三行国王的放置。

但是大家可能会疑惑,第二行明明也影响到了第一行,难道第二行放置了国王后,第一行的国王不会受影响吗?

答案是不会的,假设第二行的国王影响到了第一行的国王,那么说明第一行的某个国王在第二行某个国王的范围内,同理此时第二行的该国王也在第一行该国王的范围内,此时说明第二行放置的这个国王也是不合法的,而我们在放置第二行国王的时候就已经避开了第一行国王的范围,所以不会出现这种情况。

从上面的分析我们可以得出结论,第i行如何放置国王,取决于第i-1行是如何放置的。

那么怎样才算合法呢?

我们采用状态压缩的方式,放置国王标1,不放标0,最后组成一个二进制数A和B。
在这里插入图片描述
那么针对这两个A和B,满足下列要求的时候才算是合法的。
在这里插入图片描述

2、状态表示

f [ i ] [ j ] [ s ] f[i][j][s] f[i][j][s]表示在前 i i i行中放置国王,共放置 j j j个国王的情况下,且第 i i i行的状态是j的时候,所有的方案总数。

3、状态转移

根据一开始的分析,第i行如何放置国王取决于第 i − 1 i-1 i1行的国王放置情况,因此,我们按照第 i − 1 i-1 i1行的不同状态来写不同的方程。
f [ i ] [ j ] [ s ] = ∑ f [ i − 1 ] [ j − c o u n t ( s ) ] [ s s ] f[i][j][s]=\sum f[i-1][j-count(s)][ss] f[i][j][s]=f[i1][jcount(s)][ss]
其中 c o u n t ( s s ) count(ss) count(ss)代表状态 s s s下第 i i i行中放置了多少个国王。因为第 i i i行放置 c o u n t ( s ) count(s) count(s)个,前 i − 1 i-1 i1行只能放置 j − c o u n t ( s ) j-count(s) jcount(s)个。

4、循环设计

首先我们需要去枚举i和j,这个是比较简单的。由于我们是按照第i-1行分类的,所以我们还需要枚举第i-1中所有的可能合法的状态,接着再去根据其中的某个状态计算第i行可能合法的状态。
所以总共需要4层循环。

有人会问这个会不会超时,其实我们可以先把对于一行而言所有合法的状态存储下来,即把那些二进制中1不相邻的状态存储下来,其实经过计算满足这个条件的状态最多有144个。我们可以估算为200。
而n的最大值是10,国王个数的最大值是100,那么时间复杂度就是200 * 200 * 10 * 100=4 * 107这完全是能够算完的。

5、初末状态

这个比较简单,f[0][0][0]初始化为1即可。
最后的状态是f[n+1][m][0],即第n+1行不放国王,总共放了m个国王的总方案数。

三、代码

#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=15,K=110,S=1<<10;
long long f[N][K][S];
int n,m;
vector<int>state;
vector<int>st[S];

bool check(int x)
{
    for(int i=0;i+1<n;i++)
    {
        if((x>>i&1)&&(x>>(i+1)&1))return false;
    }
    return true;
}

int get_nums(int x)
{
    int res=0;
    for(int i=0;i<n;i++)
        res+=x>>i&1;
    return res;
}

int main()
{
    cin>>n>>m;
    for(int i=0;i<1<<n;i++)//记录所有对于本行而言合法的状态
        if(check(i))state.push_back(i);
        
    f[0][0][0]=1;
    
    for(int i=1;i<=n+1;i++)//枚举i
    {
        for(int j=0;j<=m;j++)//枚举j
        {
            for(int ss=0;ss<state.size();ss++)//枚举第i-1行的状态
            {
                for(int s=0;s<state.size();s++)//枚举第i行的状态
                {
                    if(!(state[ss]&state[s])&&(check(state[ss]|state[s])))//判断两行之间是否合法
                    {
                        int count=get_nums(state[s]);//计算第i行的国王数目
                        if(j>=count)
                        {
                            f[i][j][state[s]]+=f[i-1][j-count][state[ss]];
                        }
                    }
                }
            }
        }
    }
    cout<<f[n+1][m][0]<<endl;
    return 0;
}

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

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

相关文章

NR R16 上行满功率传输(ULFPTx)

微信公众号同步更新&#xff0c;欢迎关注同名“modem协议笔记” UL full power Tx(ULFPTx Mode)&#xff0c;上行满功率传输&#xff0c;是R16版本的一个增强&#xff0c;R15由于受限于codebook和PUSCH功率控制&#xff0c;某些情况下无法达到满功率传输&#xff08;例如26dBm…

论文投稿指南——中文核心期刊推荐(建筑科学 2)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

齐晖医药冲刺上市:毛利率持续下滑,刘祥宜和朱建民夫妇为实控人

近日&#xff0c;江苏齐晖医药科技股份有限公司&#xff08;下称“齐晖医药”&#xff09;递交预披露招股书&#xff0c;准备在上海证券交易所主板上市。本次冲刺上市&#xff0c;齐晖医药计划募资6.97亿元&#xff0c;将用于动保原料药生产基地项目、研发中心建设项目&#xf…

“编辑距离”系列总结,一文读懂(Java实现)

目录 一、判断子序列 ——>删除元素 1.1、dp定义 1.2、递推公式 1.3、初始化 1.4、遍历顺序 1.5、解题代码 二、不同的子序列 ——>删除元素 2.1、dp定义 2.2、递推公式 2.3、初始化 2.4、遍历顺序 2.5、解题代码 三、两个字符串的删除操作 ——>删除元素…

设计模式 - 六大设计原则之DIP(依赖倒置原则)

文章目录概述CaseBad ImplBetter Impl概述 设计代码架构时&#xff0c;高层模块不应该依赖于底层模块&#xff0c;二者都应该依赖于抽象。 抽象不应该依赖于细节&#xff0c;细节应该依赖于抽象。 依赖倒置原则是实现开闭原则的重要途径之一&#xff0c; 它降低了类之间的耦合…

代码随想录算法训练营第十天 | 理论基础,232.用栈实现队列,225. 用队列实现栈

一、参考资料理论基础文章讲解&#xff1a;https://programmercarl.com/%E6%A0%88%E4%B8%8E%E9%98%9F%E5%88%97%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 用栈实现队列题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0232.%E7%94%A8%E6%A0%88%E5%AE%9E%E…

【Linux】多线程详解(上)

&#x1f387;Linux&#xff1a; 博客主页&#xff1a;一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 看似不起波澜的日复一日&#xff0c;一定会在某一天让你看见坚持…

百度2015年系统工程师笔试题:判断当前机器的大小端

本篇文章主要讲解大小端的判断问题&#xff0c;需要拥有指针&#xff0c;位段&#xff0c;联合体的知识。 目录 一.题目呈现 二.三种解题方法 1.巧妙利用指针和强制转换 2.利用位段的特性 3.利用联合体的性质 一.题目呈现 请简述大端字节序和小端字节序的概念&#xff0c;…

剑指 Offer 03. 无重复字符的最长子串 [C语言]

目录题目思路1代码1结果1思路2代码2结果2该文章只是用于记录考研复试刷题题目 Leetcode 03: 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所…

A股上市公司招投标数据

一、数据简介 招投标是指在市场经济条件下进行大宗货物的买卖、工程建设项目的发包与承包以及服务项目的采购与提供时所采取的一种普遍交易方式。招标和投标是一种商品交易行为&#xff0c;是交易过程的两个方面。历经三十多年的发展&#xff0c;我国已经形成了覆盖全国各领域、…

Java类和对象的学习笔记

本篇介绍了面向对象和面向过程的关系,类的定义,对象的成员(成员变量,成员方法)和对象成员访问,类和对象的关系 对象的初始化,对象的构造(构造方法的定义和使用),对象内的this介绍和用法… 细节较多.建议收藏,看完此篇,踏上面向对象的第一步~ 类和对象的学习一.初识面向对象1.什…

一文读透JVM虚拟机结构[迭代中]

注: 码字辛苦, 转载请标注转载来源 jvm结构图: [1] 整个JVM架构包含三部分: 类加载 加载 双亲委派机制 链接 初始化 静态变量的初始值赋值 运行时数据区域 线程私有区域线程共享区域 执行引擎 解释器JIT即时编译器GC 运行时数据区域 线程私有区域: 线程私有区域主…

Springboot整合分布式链路追踪SkyWalking之探针使用和链路采集实战(二)

目录 1.链路追踪-框架Springboot项目搭建 1.1 创建一个Springboot项目 1.2 SpringBootMybaitsPlusMysql开发测试接口 1.2.1 添加依赖配置pom.xml 1.2.2 添加配置 application.properties 1.2.3 开发接口 ​ 2.分布式链路追踪的卧底 Skywalking Agent 探针介绍 2.1 Skyw…

Java设计模式-解释器模式Interpreter

介绍 在编译原理中&#xff0c;一个算术表达式通过词法分析器形成词法单元&#xff0c;而后这些词法单元再通过语法分析器构建语法 分析树&#xff0c;最终形成一颗抽象的语法分析树。这里的词法分析器和语法分析器都可以看做是解释器解释器模式&#xff08;Interpreter Patte…

Linux操作系统使用git提交代码

引言&#xff1a; 北京时间 2023/1/27/9:50&#xff0c;今天的起床时间9:05&#xff0c;可以看出我们是提前了一些些&#xff0c;但是不是我的功劳&#xff0c;当然也不是我的闹钟的功劳&#xff0c;毕竟我的闹钟是8:20和8&#xff1a;50的&#xff0c;因为我亲爱的老妈……懂…

threejs相机控件使用记录

文章目录前言控件列表轨迹球控制器&#xff08;TrackBallControls&#xff09;第一人称控制器&#xff08;FirstPersonControls&#xff09;飞行控制器&#xff08;FlyControls&#xff09;轨道控制器&#xff08;OrbitControls&#xff09;总结前言 threejs提供了很多摄像机控…

mixamo和ue小白人映射关系以及让mixamo绑定的人物在场景中运动的多种方法实践...

ue中的root->Hips ue中 ik_foot_l ik_foot_r下面有foot_r 在mixamo下面leftfoot对应ik_foot_l 但是foot_l 只能给他对应leftToeBase 了 image.pngspline 盆骨对应pelvis 在绑定控制中进行修改即可. image.png方法一 拷贝动画蓝图 [本人原创方法] 此方法毕竟操蛋,虽然完美兼容…

Linux驱动开发基础__休眠与唤醒

目录 1 适用场景 2 内核函数 2.1 休眠函数 2.2 唤醒函数 3 驱动框架 4 编程 4.1 gpio_key_drv.c 4.2 button_test.c 4.3 Makefile 1 适用场景 在前面引入中断时&#xff0c;我们曾经举过一个例子&#xff1a; 妈妈怎么知道卧室里小孩醒了&#xff1f; 休眠-唤醒&…

pytorch深度学习案例(一)——手写数学符号识别

文章目录前言简介数据集项目结构utils模块dataLoadermodelsplotShowtrain模块predict模块下载地址前言 在前面的两篇文章中我们介绍了现代计算机视觉中常见的结构化和非结构化的CNN模型&#xff0c;本篇我们将使用这些CNN模型在手写数学符号数据集上进行识别。 CNN模型的介绍请…

2022回顾

2022年回顾 前言 新年和亲朋好友的相聚差不多接近尾声&#xff0c;假期也所剩无几&#xff0c;开始静下心来写作&#xff0c;回顾一下我的2022年&#xff0c;看下自己去年 做得好的和不足&#xff0c;展望下2023&#xff0c;开始新一年的生活。&#xff08;因为是公历2023年…