【2024.4.11练习】国际象棋

题目描述


题目思路

棋盘类问题是一类典型的状态压缩dp问题,将0设为不摆放象棋,1设为摆放象棋。这样棋盘的每一列都可以变成01的序列。每一列有8个格子,所以每列总共有2^6=64种摆放情况。为了完成递推,需要写出以下功能的预处理函数 init ( ):
一、通过输入的二进制数计算出其中1的个数,以便计算已经摆放了多少个象棋。

二、根据前一列的摆放情况,判断后一列和后两列有哪些情况是不可摆放的(因为一列的象棋最多影响后两列)。

完成以上准备后开始动态规划。建立数组dp[i][j][k][l],表示第i列、以二进制数j结尾、前一列以二进制数k结尾,且总共使用了l个棋子的总摆放方案数。理想状态下的状态转移方程为:
dp[i][j][k][l]=\sum_{m=0}^{63}dp[i-1][k][m][l-count(j)]

前提条件是j可以摆在k后一排,且j可以摆在m后两排,这时就需要之前的预处理进行排除。


我的代码

动态规划部分不得已使用了五重循环,好在每层循环次数不高并且测试数据还比较人性,最终能在规定时间内解决问题。使用位运算&时一定要加括号!否则会在if判断的时候出错。

#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
int ban1[64]; //储存对应后一列不能摆放的位置(为1则无法摆放)
int ban2[64]; //储存对应后两列不能摆放的位置
int c[64];
ll dp[101][64][64][21];
int N;
int M;
int K;
ll ans = 0;
	//预处理
void init() {
	for (int i = 0; i < 64; i++)
	{
		int tmp = 0;
		int tmp2 = 0;
		int count = 0;
		for (int j = 0; j < 6; j++)
		{
			if ((i >> j) & 1) {
				if (j + 2 < 6) {
					tmp = tmp | (1 << j + 2);
				}
				if (j - 2 >= 0) {
					tmp = tmp | (1 << j - 2);
				}
				if (j + 1 < 6) {
					tmp2 = tmp2 | (1 << j + 1);
				}
				if (j - 1 >= 0) {
					tmp2 = tmp2 | (1 << j - 1);
				}
				count++;
			}
		}
		ban1[i] = tmp;
		ban2[i] = tmp2;	
		c[i] = count;
	}
}
int main() {
	init();
	int i;
	int j;
	int k;
	int l;
	int m;
	//初始化
	cin >> N >> M >> K;
	for (i = 0; i < (1 << N); i++)
	{
		for (j = 0; j < (1 << N); j++)
		{
			for (k = 0; k < K + 1; k++)
			{
				dp[0][i][j][k] = 0;
			}
		}
	}
	dp[0][0][0][0] = 1;
	//动态规划
	for (i = 1; i <= M; i++)
	{
		for (j = 0; j < (1 << N); j++)
		{
			for (k = 0; k < (1 << N); k++)
			{
				for (l = c[j]; l < K+1; l++) {
					dp[i][j][k][l] = 0;
					if ((j & ban1[k]) == 0) {
						for (m = 0; m < (1 << N); m++) {
							if ((j & ban2[m]) == 0) {
								dp[i][j][k][l] += dp[i - 1][k][m][l - c[j]];
								dp[i][j][k][l] = dp[i][j][k][l] % 1000000007;
							}
						}
					}
				}
			}
		}
	}
	//输出答案
	for (j = 0; j < (1 << N); j++)
	{
		for (k = 0; k < (1 << N); k++)
		{
			ans += dp[M][j][k][K];
			ans = ans % 1000000007;
		}
	}
	cout << ans << endl;
	return 0;
}

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

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

相关文章

如何安装PyFluent

0.什么是PyFluent? 官方介绍如下&#xff1a; PyFluent 是 PyAnsys 生态系统的一部分&#xff0c; 允许您在所选的 Python 环境中结合使用 Fluent 与其他 PyAnsys 库和外部 Python 库一起使用。 PyFluent 实现了客户端-服务器体系结构。它使用谷歌遥控器 过程调用或 gRPC 接…

Cyber Weekly #1

赛博新闻 1、弱智吧竟成最佳中文AI训练数据&#xff1f;&#xff01;中科院等&#xff1a;8项测试第一&#xff0c;远超知乎豆瓣小红书 使用弱智吧数据训练的大模型&#xff0c;跑分超过百科、知乎、豆瓣、小红书等平台&#xff0c;甚至是研究团队精心挑选的数据集。弱智吧数…

审查元素时,hover等伪元素,只会在鼠标悬停在对应元素上时生效。一旦鼠标移开,样式就会消失,已解决

最近遇到个小小的问题 当el-input 设置cleable属性的时候&#xff0c;鼠标移入输入框内&#xff0c;会有个清除的图标 输入框的内容居右显示&#xff0c;导致清除的图标和内容重叠了 通过控制台查看元素&#xff0c;只有在鼠标悬停在对应元素上时生效。一旦鼠标移开&#xf…

JR-SMD201网络直播解码器

详细介绍&#xff1a; JR-SMD201网络直播解码器&#xff0c;支持AVS/H.265/H.264/MPEG2解码&#xff0c;支持IP输入&#xff0c;支持1080P/1080I/720P/576I/480I多种分辨率&#xff0c;支持DRA/AC3/EAC3/AAC/MPEG等音频。 产品特点 支持多种输入方式IP 接口丰富&#xff0c;CV…

ELK(Elasticsearch+Logstash+Kibana)日志分析系统

目录 前言 一、ELK日志分析系统概述 1、三大组件工具介绍 1.1 Elasticsearch 1.1.1 Elasticsearch概念 1.1.2 关系型数据库和ElasticSearch中的对应关系 1.1.3 Elasticsearch提供的操作命令 1.2 Logstash 1.2.1 Logstash概念 1.2.2 Logstash的主要组件 1.2.3 Logsta…

【MATLAB源码-第8期】基于matlab的DPSK的误码率仿真,差分编码使用汉明码(hanming)。

1、算法描述 差分相移键控常称为二相相对调相&#xff0c;记作2DPSK。它不是利用载波相位的绝对数值传送数字信息&#xff0c;而是用前后码元的相对载波相位值传送数字信息。所谓相对载波相位是指本码元初相与前一码元初相之差。差分相移键控信号的波形如概述图所示。 假设相对…

前端开发攻略---轻松实现排序功能:利用JavaScript创建直观的拖拽排序体验

拖拽事件主要包括以下几种&#xff1a; dragstart&#xff08;拖拽开始&#xff09;&#xff1a;当用户开始拖拽一个元素时触发&#xff0c;通常在被拖拽的元素上绑定此事件。在该事件的处理函数中&#xff0c;可以设置被拖拽元素的一些属性或数据。 drag&#xff08;拖拽移动…

【Shell语言学堂】函数调用练习

Shell编程的函数 Shell中的函数概念优点标准shell函数定义函数调用实战案例1、实现画菱形2、将画正三角和倒三角拆分为两个函数3、将菱形的代码拆解成1个函数&#xff1a;画空格和*号4、将十进制的IP地址转为二进制5、选做&#xff1a;将二进制的IP地址转为十进制 Shell中的函数…

多通道电路PCB如何布局布线 - Altium Designer模块复用功能介绍

原文出自微信公众号【小小的电子之路】 电路设计的过程中难免会遇到多通道电路设计&#xff0c;在通道数较少的情况下&#xff0c;可以多花点时间&#xff0c;一个通道一个通道地布局布线&#xff0c;但是在通道数特别多的情况下&#xff0c;这种方法就不现实了&#xff0c;好在…

掼蛋的5-10原则

掼蛋的5-10原则指的是在掼蛋游戏重&#xff0c;所有的5被打出后&#xff0c;牌面上就不可能有9以下的小顺子&#xff1b;而当10都被打出后&#xff0c;6以上到A的顺子也没有了。这就被掼蛋玩家用来判断手中顺子的实际价值。 前期注意观察5和10的出牌情况。如果起手就有较多的5和…

gradio简单搭建——关键词简单筛选【2024-4-11优化】

gradio简单搭建——关键词简单筛选[2024-4-11 优化] 新的思路&#xff1a;标签自动标注界面搭建优化数据处理与生成过程交互界面展示 新的思路&#xff1a;标签自动标注 针对通过关键词&#xff0c;在文本数据中体现出主体的工作类型这一任务&#xff0c;这里使用展示工具grad…

VS中使用QT的UI提升类时,找不到头文件的情况

1、情况简述 在使用VS时&#xff0c;会发现与QCreator存在一些差异。最主要的就是要设置很多东西&#xff0c;如果不配置的话&#xff0c;就会遇到一些问题。下面我分享下我调试过程中遇到的一个问题。使用Qdesigner的UI提升类时&#xff0c;找不到头文件的情况&#xff1a; …

安装 windows 版 dash —— zeal

1、下载安装 下载地址&#xff1a;Download Zeal 选择 Protable 版 直接使用 zeal 下载文档比较慢甚至失败&#xff0c;可以设置代理&#xff0c;也可以使用下面两种方式。 2、手动下载 docset 文档后导入 这种方法不能够选择文档的版本 &#xff08;1&#xff09;在 http://…

如何将CSDN的文章以PDF文件形式保存到本地

1.F12 打开开发者工具窗口 2.console下输入命令 (function(){$("#side").remove();$("#comment_title, #comment_list, #comment_bar, #comment_form, .announce, #ad_cen, #ad_bot").remove();$(".nav_top_2011, #header, #navigator").remove…

全球数字贸易产业联盟分享18个抓单秘诀让你业绩暴涨 | 箱讯科技

1、你就是企业 即使你所在的公司有庞杂的分支机构和几千名职工&#xff0c;但对于顾客来讲&#xff0c;公司就是你&#xff0c;同他直接接触的是你。顾客把你的公司看作一个仅为满足他要求的整体。结论一&#xff1a;不可以把问题推给另一部门&#xff1b;结论二&#xff1a;若…

Unity构建详解(7)——AssetBundle格式解析

【文件格式】 文件可以分为文本文件、图片文件、音频文件、视频文件等等&#xff0c;我们常见的这些文件都有行业内的标准格式&#xff0c;其意味着按照一定的规则和规范去保存读取文件&#xff0c;可以获取我们想要的数据。 有些软件会有自己的文件格式&#xff0c;会按照其…

SpringBoot学习笔记四

SpringBoot学习笔记四-监听机制 1. SpringBoot监听器1.1 无需配置1.1.1 CommandLineRunner使用1.1.2 ApplicationRunner的使用1.1.3 CommandLineRunner与ApplicationRunner的区别 1.2 需要创建META-INF文件&#xff0c;并在其中创建spring.factories&#xff0c;配置相关的信息…

WEB3浪潮下的全新体验:精灵派对链游引领边玩边赚的创新之旅

在当前的数字经济浪潮中&#xff0c;区块链技术以其独特的去中心化特性&#xff0c;正在逐渐改变我们的生活和工作方式。其中&#xff0c;区块链游戏&#xff08;链游&#xff09;作为新兴的领域&#xff0c;正以其独特的优势吸引着全球玩家的目光。在这样一个背景下&#xff0…

Windows系统安装WinSCP结合内网穿透实现公网远程SSH本地服务器

List item 文章目录 1. 简介2. 软件下载安装&#xff1a;3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 ​ Winscp是一个支持SSH(Secure SHell)的可视化SCP(Secure Copy)文件传输软件&#xff0c;它的主要功能是在本…

Win11又来「重大」更新!

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站ai人工智能工具 更多资源欢迎关注 Windows 11预览通道的22635.3420版本迎来了几个比较大的改进&#xff0c;主要有三个方面&#xff1a; …