acwing 1064 小国王 线性状态压缩DP

news2024/9/20 13:44:03

在这里插入图片描述
输入

3 2

输出

16

🍺 AC code

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>

using namespace std;

typedef long long ll;
const int N = 12;
const int M = 1 << 10, K = 110;//k表示国王数
int n,m;
vector<int> state;//存储所有单行合法状态
int id[M];//存的是每一个状态和这个它的下标之间的对应关系
vector<int> head[M];//记录每个状态可以转到哪些其他的状态
int cnt[M];//记录状态 i 里边 1 的个数

ll f[N][K][M];

bool check(int state)
{
	for(int i = 0; i < n; i++)
		if((state >> i & 1) && (state >> (i + 1) & 1))
			return false;
	return true;
}
// 计算 state 二进制 里边有多少个 1
int count(int state )
{
	int res = 0;
	for(int i = 0; i < n; i++)
		res += state >> i & 1;
	return res;
}

int main(){
	cin >> n >> m;// n是 棋盘边长,m是 国王个数
	
//	预处理单行合法状态
	for(int i = 0; i < 1 << n; i++)
		if(check(i))
		{
			state.push_back(i);
			id[i] = state.size()-1;//id存的是 状态 i 所对应的state下标
			cnt[i] = count(i); 		
		}
	
//	预处理状态之间是否可以转移(即上一行状态和下一行状态是否冲突)
	for(int i = 0; i < state.size(); i++)// i是当前状态的下标
		for(int j = 0; j < state.size(); j++)// j 是下一个状态的下标
		{
			int a = state[i];
			int b = state[j];
//			没有冲突的1			没有连续的两个 1
			if((a & b) == 0 && check(a | b))//合法
				head[i].push_back(j);//表示 i 下边可以接 j
		}
	
//	开始DP
	f[0][0][0] = 1;
	for(int i = 1; i <= n+1; i++)// i 表示行数
		for(int j = 0; j <= m; j++)// j 表示国王数
			for(int a = 0; a < state.size(); a++)// a 表示第 i 行状态的下标
				for(int b = 0; b < head[a].size(); b++)// b 表示第 i+1 可能转移到的状态
				{
					int c = cnt[state[a]];//c 记录 第i行状态 state[a]中 1 的个数
//			第 i 行采取k状态表示 会 放置 c 个国王,当前状态 f[i][j][k] 表示前i层放置了 j 个国王
//			所以 c 的上限是 j
					if(j >= c)
						f[i][j][a] += f[i-1][j-c][head[a][b]];
				}
					
	cout << f[n+1][m][0] << endl;
	
	return 0;
}




👨‍🏫 参考题解

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

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

相关文章

Openlayers:DWS-DD坐标形式互相转换

参考google地图, 坐标分为DD和DMS两种形式。 在本示例中,DWS-DD做互相转换。Openlayers处理DD-》DMS很简单,逆向操作需要做反向推导,方法参考源代码。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhuanlan),还是大剑师兰特(CSDN) * @此源代码版权归大剑师兰特所有…

Linux【网络基础】IP协议

文章目录 一、IP协议&#xff08;1&#xff09;IP地址协议概念和理解&#xff08;2&#xff09;IP地址协议格式&#xff08;3&#xff09;网络号和主机号&#xff08;4&#xff09;地址管理&#xff08;一&#xff09;分配IP地址方法&#xff08;二&#xff09;CIDR分配IP地址&…

基本频谱分析

基本频谱分析 傅里叶变换是用于对时域信号执行频率和功率谱分析的工具。 频谱分析数量 频谱分析研究非均匀采样的离散数据中包含的频谱。傅里叶变换是通过在频率空间表示基于时间或空间的信号来揭示该信号的频率分量的工具。下表列出了用于描述和解释信号属性的常用量。要了…

Axios GET 请求:从入门到实践

在进行网络请求时&#xff0c;axios 是一个非常常用的请求库。本文将介绍如何使用 axios 发起 GET 请求&#xff0c;并详细列出传参的几种写法。同时会提供一个实践案例&#xff0c;其中包含基本路由与请求处理的过程&#xff0c;并确保在 IDE 编辑器中可以顺利运行。 什么是 a…

STM32入门——GPIO输入输出

GPIO简介 GPIO&#xff08;General Purpose Input Output&#xff09;通用输入输出口 可配置为8种输入输出模式引脚电平&#xff1a;0V~3.3V&#xff0c;部分引脚可容忍5V输出模式下可控制端口输出高低电平&#xff0c;用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等输入模…

ES6 数组的用法

1. forEach() 用来循环遍历的 for 数组名.forEach(function (item,index,arr) {})item:数组每一项 , index : 数组索引 , arr:原数组作用: 用来遍历数组 let arr [1, 2, 3, 4]; console.log(arr); let arr1 arr.forEach((item, index, arr) > {console.log(item, index…

SpringBoot第29讲:SpringBoot集成MySQL - MyBatis-Plus代码自动生成

SpringBoot第29讲&#xff1a;SpringBoot集成MySQL - MyBatis-Plus代码自动生成 本文是SpringBoot第29讲&#xff0c;主要介绍 MyBatis-Plus代码自动生成&#xff0c;以及产生此类代码生成工具的背景和此类工具的基本实现原理。 文章目录 SpringBoot第29讲&#xff1a;SpringBo…

em3288 linux_4.19 第一次烧写无法进入内核的情况

1. 情况一&#xff1a; /DDR Version 1.11 20210818 In SRX Channel a: DDR3 400MHz Bus Width32 Col10 Bank8 Row15 CS1 Die Bus-Width16 Size1024MB Channel b: DDR3 400MHz Bus Width32 Col10 Bank8 Row15 CS1 Die Bus-Width16 Size1024MB OUT Boot1 Release Time: Jul 22 2…

pyecharts包的简单使用

pyecharts简介 Pyecharts是一个Python的数据可视化库。 它基于ECharts&#xff0c;一个由百度开发的流行的JavaScript图表库。Pyecharts旨在为Python用户提供一种简便的方法来创建各种类型的交互式图表&#xff0c;包括折线图、柱状图、散点图、饼图、地图等。通过使用Pyechar…

场景库之高精度地图编辑器

一、背景介绍 高精度地图编辑器是场景库生产所需的必要工具&#xff0c;地图编辑器基于JS开发&#xff0c;可对指定的地图进行描绘&#xff0c;生成数字高精度地图。 二、功能介绍 路网元素支持&#xff1a; 类别元素图片交叉口交叉口安全岛交通岛导流岛道路中心圈路口边缘线…

ATTCK实战系列-红队评估 (红日靶场3)Vulnstack三层网络域渗透靶场

文章目录 环境配置靶场介绍靶场设置 外网渗透信息收集端口扫描目录扫描 漏洞发现与利用获取ssh账号密码&#xff0c;登录centos 提权 内网渗透建立代理内网信息收集smb暴破&#xff0c;获取本地管理员密码 横向移动使用psexec模块上线msf 环境配置 靶场介绍 靶场地址 http:/…

[LeetCode]链表相关题目(c语言实现)

文章目录 LeetCode203. 移除链表元素LeetCode237. 删除链表中的节点LeetCode206. 反转链表ⅠLeetCode92. 反转链表 II思路 1思路 2 LeetCode876. 链表的中间结点剑指 Offer 22. 链表中倒数第k个节点LeetCode21. 合并两个有序链表LeetCode86. 分隔链表LeetCode234. 回文链表Leet…

如何打造属于自己的个人IP?

在当今信息爆炸的时代&#xff0c;个人 IP 已经成为人们在网络世界中的独特标签。无论是在职场上、创业中&#xff0c;还是在社交生活中&#xff0c;拥有个人 IP 的人都能脱颖而出&#xff0c;吸引更多的关注和机会。那么&#xff0c;如何打造属于自己的个人 IP 呢&#xff1f;…

机器学习和深度学习简述

一、人工智能、机器学习、深度学习的关系 近些年人工智能、机器学习和深度学习的概念十分火热&#xff0c;但很多从业者却很难说清它们之间的关系&#xff0c;外行人更是雾里看花。概括来说&#xff0c;人工智能、机器学习和深度学习覆盖的技术范畴是逐层递减的&#xff0c;三…

华为OD机试真题 JavaScript 实现【名字的漂亮度】【牛客练习题】

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、JavaScript算法源码 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试&#xff0c;发现新题目&#x…

vue3实现拖拽排序

效果&#xff1a; 实现 <template><div class"box"><divv-for"(item, index) in items":key"item.id"class"item":style"{ order: item.order }":draggable"true"dragstart"onDragStart(in…

redis的安装和配置

一、nosql 二、redis的安装和配置 redis的安装&#xff1a; redis常见配置&#xff1a; 配置文件redis.conf

DP学习第五篇之礼物的最大价值

DP学习第五篇之礼物的最大价值 剑指 Offer 47. 礼物的最大价值 - 力扣&#xff08;LeetCode&#xff09; 一.题目解析 二. 算法原理 状态表示 tips: 经验题目要求。以[i,j]位置为结尾&#xff0c;。。。 dp[i][j]: 到达[i, j]位置时&#xff0c;此时的最大礼物价值 状态转移…