【2024.4.11练习】国际象棋

news2025/2/24 8:34:17

题目描述


题目思路

棋盘类问题是一类典型的状态压缩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;
}

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

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

相关文章

无缝集成:使用Spring Boot和Vue实现头像上传与回显功能

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

STC89C52学习笔记(五)

STC89C52学习笔记&#xff08;五&#xff09; 综述&#xff1a;文本讲述了代码中速写模板的创建、如何将矩阵键盘的按键与数字一一对应以及如何创建一个矩阵键盘密码锁。 一、速写模板 点击“templates”&#xff0c;再鼠标右键选择配置&#xff0c;按照以下方式即可修改一些…

正压自动放水器

劣质产品或许能骗一个人 却骗不了一群人 更骗不了五湖四海的人 因为品质&#xff0c;所以传播因为认同&#xff0c;所以分享 一、正压放水器概述&#xff1a; 正压自动放水器的型号为CWG-ZY&#xff0c;C指瓦斯抽放&#xff08;采&#xff09;中抽放&#xff08;采&#xff…

Linux系统概述与安装

Linux的介绍 Linux内核 Linux内核是 Linux 操作系统主要组件&#xff0c;也是计算机硬件与其软件之间的交互入口。它负责两者之间的通信&#xff0c;还要尽可能高效地管理资源 Linux Shell shell是系统的用户界面&#xff0c;提供了用户与内核进行交互操作的一种接口 Linux文…

Vmware虚拟机Centos7固定IP地址

1、点击编辑-虚拟网络编辑器 2、点击更改设置、修改虚拟网络配置器并确认保存&#xff08;见图&#xff09; 这个子网IP和子网掩码的前三位需要一样网关的前三位需要和子网ip一致。 3、打开设置“网络和Internet”&#xff0c;点击“更改适配器选项”&#xff0c;点击适配器VM…

Github第一Star数的国产免费开源防火墙--雷池社区版初步体验

前言 近期准备搭建一个博客网站&#xff0c;用来存储工作室同学们的学习笔记。服务器准备直接放在公网上&#xff0c;方便大家随时随地的上传和浏览&#xff0c;为了防止网站被人日穿成为肉鸡&#xff0c;一些防御措施还是要部署的。 首先明确自己的需求&#xff1a; 零成本…

【数据结构】双向链表 C++

一、什么是双向链表 1、定义 双向链表也叫双链表&#xff0c;是链表的一种&#xff0c;它的每个数据结点中都有两个指针&#xff0c;分别指向直接后继和直接前驱。所以&#xff0c;从双向链表中的任意一个结点开始&#xff0c;都可以很方便地访问它的前驱结点和后继结点。 双…

企业工商信息查询API接口有哪些

当今社会我们几乎每天都在和一些企业打交道&#xff0c;有时候需要确认下这家企业经营范围&#xff0c;注册地址等信息&#xff0c;那怎么办呢&#xff0c;这个时候就需要一些企业工商信息查询的API接口了。 有的时候你可以只知道这家公司的大概企业名称&#xff0c;比如数脉&…

Python中sort()函数、sorted()函数的用法深入讲解(具体实例:蓝桥杯数位排序)

前置知识&#xff1a; 可迭代对象的定义&#xff1a;可迭代对象是指可以被迭代或遍历的对象&#xff0c;即可以使用循环结构对其进行逐个访问的对象。 在Python中常见的可迭代对象有&#xff1a;列表(list)、元组&#xff08;tuple&#xff09;、字符串&#xff08;sting&…

【踩坑日记】Pop!OS中文输入法的坑

文章目录 前言一、编译安装最新的IBus-pinyin输入法1.卸载旧输入法2.安装编译依赖3.下载源码4.编译和安装libpinyin5.编译和安装ibus-libpinyin6.重启IBus服务二、安装Fcitx5前言 使用Linux时,特别是涉及到中文的时候,会遇到一些问题。我最近在使用Pop!OS 22.04,这是Ubuntu…

如何监控容器或K8s中的OpenSearch

概述 当前 OpenSearch 使用的越来越多, 但是 OpenSearch 生态还不尽完善. 针对如下情况: 监控容器化或运行在 K8s 中的 OpenSearch 我查了下, 官方还没有提供完备的方案. 这里如何监控 K8s 中的 OpenSearch, 包括安装 exporter 插件、采集、展示全环节。 OpenSearch 简介…

数据库数据恢复—Sql Server数据库文件丢失如何恢复数据?

服务器数据恢复环境&#xff1a; 一台安装windows server操作系统的服务器。一组由8块硬盘组建的RAID5&#xff0c;划分LUN供这台服务器使用。 在windows服务器内装有SqlServer数据库。存储空间LUN划分了两个逻辑分区。 服务器故障&初检&#xff1a; 由于未知原因&#xf…

git 删除本地分支 删除远程仓库分支

语法&#xff1a; 删除本地分支 git branch -D <分支名>删除远程分支 git push <remote名称> <分支名> --delete 示例&#xff1a; 删除本地分支 git branch -D feature/test_listview删除远程分支 git push origin feature/test_listview --delete 两个…

润色问题解惑

上博士为了毕业写学术论文头都大了&#xff0c;但更难受的是英语不咋地&#xff0c;投稿后经常会因为语言问题而惨遭拒稿&#xff0c;每每想起就令人心情郁郁&#xff0c;天台可期。有些审稿人也会直接告知需要专业的修改&#xff0c;那咋整呢&#xff0c;让润色呗&#xff0c;…

腾讯社交广告推广如何开户和费用攻略

腾讯社交广告平台&#xff0c;依托腾讯系庞大的用户基数与丰富的应用场景&#xff0c;为广告主提供了极具潜力的营销渠道。从微信朋友圈、QQ空间到腾讯新闻、腾讯视频等多款热门应用&#xff0c;腾讯社交广告覆盖了亿万级用户群体&#xff0c;是企业提升品牌知名度、推动产品销…

如何做好谷歌广告投放?谷歌广告投放要点解析

市场是在不断变化的&#xff0c;搜索引擎上的网站排名也随着市场的变化而变化。如果你的广告战术一成不变&#xff0c;很容易花冤枉钱。从本质上来讲&#xff0c;谷歌广告的优化工作就是让商家在搜索引擎上保持长久的市场竞争力。 如果商家不经常优化Google广告&#xff0c;可能…

谈谈系列之OA又见OA

确实没想到&#xff0c;绕了一圈&#xff0c;居然又回到了OA&#xff0c;当年从HW从来&#xff0c;就是不想仅仅只做给内部人用的产品&#xff0c;没想到兜兜转转&#xff0c;又回到了给“内部人做产品”的“老路”。 当然&#xff0c;就像先哲赫拉克利特说的——人不能两次走进…

【随笔】Git 高级篇 -- 提交的技巧(下) cherry-pick commit --amend(十九)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

【CSS】CSS三大特性、盒子模型

目录 CSS三大特性 1、层叠性 2、继承性 3、优先级 盒子模型 1、网页布局的本质 2、盒子模型&#xff08;Box Model&#xff09;组成 3、边框&#xff08;border&#xff09; 3.1、边框的使用 3.2、表格的细线边框 3.3、边框会影响盒子实际大小 4、内边距&#xff0…

【AUTOSAR网络管理测试】PowerOn→BSM

&#x1f64b;‍♂️【AUTOSAR网络管理测试】系列&#x1f481;‍♂️点击跳转 文章目录 1.状态机分析2.环境搭建3.测试步骤4.结果分析 1.状态机分析 PowerOn→BSM&#xff1a;上电初始化的&#xff0c;会默认进入BSM状态 测试点&#xff1a;确认上电后&#xff0c;任何唤醒源…