蓝桥杯第246题——矩阵计数

题目描述

一个 N×M 的方格矩阵,每一个方格中包含一个字符 O 或者字符 X。

要求矩阵中不存在连续一行 3 个 X 或者连续一列 3 个 X。

问这样的矩阵一共有多少种?

输入描述

输入一行包含两个整数 N,M (1≤N,M≤5)。

输出描述

输出一个整数代表答案。

输入输出样例

示例

输入

2 3

输出

49

解题思路

考虑到每一个格子的位置只有两种状态,以及题目数据规模较小,可以考虑到状态压缩dp思路,也可以通过位运算配合dfs排列组合进行验证。

我们可以用位运算获得所有满足要求的行,即一行没有三个连续的1的所有情况,本题的关键也正是用位运算技巧代替X和O符号。

如果使用dfs配合排列组合验证,代码写起来就会比较简单:

import java.util.ArrayList;
import java.util.Scanner;public class Main1 {static int n, m;static ArrayList<Integer> row;public static void main(String[] args) {Scanner sc = new Scanner(System.in);n = sc.nextInt();m = sc.nextInt();row = new ArrayList<>();outer:for (int i = 0; i < (1 << m); i++) {int test = 7;while (test <= i) {if ((i & test) == test) {continue outer;}test <<= 1;}row.add(i);}matrix = new int[n];dfs(0);System.out.println(ans);}static int[] matrix;static int ans = 0;static boolean check() {for (int i = 0; i + 2 < n; i++) {if ((matrix[i] & matrix[i + 1] & matrix[i + 2]) != 0) {return false;}}return true;}static void dfs(int s) {if (s == n) {if (check()) {ans++;}return;}for (int e : row) {matrix[s] = e;dfs(s + 1);}}
}

如果使用状态压缩dp,对于这道题而言建模起来就比较有难度。

定义dp[i][j][k]为,当前为第i行时,本行的合法状态为j,前一行的合法状态为k时的排列数。

在循环计算中,我们内层循环需要编写3层,一次搜索3行的状态进行验证,即下面代码中的j、k、l分别表示三行的状态,最后将最后一行所有的状态的情况加起来,就是答案:

import java.util.*;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int m = sc.nextInt();ArrayList<Integer> row = new ArrayList<>();outer:for (int i = 0; i < (1 << m); i++) {int test = 7;while (test <= i) {if ((i & test) == test) {continue outer;}test <<= 1;}row.add(i);}int[][][] dp = new int[n][1 << m][1 << m];for (int e : row) {dp[0][e][0] = 1;}for (int i = 1; i < n; i++) {for (int j = 0; j < row.size(); j++) {for (int k = 0; k < row.size(); k++) {for (int l = 0; l < row.size(); l++) {if ((row.get(j) & row.get(k) & row.get(l)) == 0) {dp[i][row.get(j)][row.get(k)] += dp[i - 1][row.get(k)][row.get(l)];}}}}}long ans = 0;for (int i = 0; i < row.size(); i++) {for (int j = 0; j < row.size(); j++) {ans += dp[n - 1][row.get(i)][row.get(j)];}}System.out.println(ans);}
}

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

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

相关文章

SpringBoot内置插件的使用(jackson和lombok)

文章目录 引言I lombok(自动为属性生成构造器)II jacksonsee also引言 idea2021.2.2 已经捆绑安装jackson和lombok插件 I lombok(自动为属性生成构造器) Lombok能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。 https://p…

Spring Cloud Gateway详解

文章目录 Gateway搭建路由&#xff08;route&#xff09;断言&#xff08;Predicate &#xff09;自定义断言 过滤器&#xff08;filter&#xff09;自定义全局过滤器 引言 在传统的单体项目中&#xff0c;前端和后端的交互相对简单&#xff0c;只需通过一个调用地址即可实现。…

【C语言题解】用函数来模拟实现strlen()、strcpy()、strcmp()、strcat()

&#x1f970;欢迎关注 轻松拿捏C语言系列&#xff0c;来和 小哇 一起进步&#xff01;✊ 学习了函数后&#xff0c;老师让我们用函数来实现上面这四个字符串函数。 我们首先来了解一下这四个字符串函数&#xff1a; 1.strlen函数 用于获取字符串长度&#xff08;不包括末尾…

每日OJ题_贪心算法四②_力扣435. 无重叠区间

目录 力扣435. 无重叠区间 解析代码 力扣435. 无重叠区间 435. 无重叠区间 难度 中等 给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互不重叠 。 示例 1: 输入: intervals [[1,2]…

机器学习-有监督学习

有监督学习是机器学习的一种主要范式&#xff0c;其基本思想是从有标签的训练数据中学习输入和输出之间的关系&#xff0c;然后利用学习到的模型对新的输入进行预测或分类。 有监督学习的过程如下&#xff1a; 1. 准备数据&#xff1a;首先&#xff0c;需要准备一组有标签的训练…

WPF EventSetter 写法

感觉这玩意之前一直没用过&#xff0c;可能在容器里用到的比较多吧&#xff0c;记录一下。 第一种代码法&#xff1a; Style itemContainerStyle new Style(typeof(ListBoxItem));itemContainerStyle.Setters.Add(new Setter(ListBoxItem.AllowDropProperty, true));itemCont…

IDEA安装使用Git

IDEA安装使用Git 1 Git下载与安装 2 在IDEA中使用Git 2.1 IDEA中配置Git 在IDEA中使用Git&#xff0c;本质上还是使用本地安装的Git软件&#xff0c;所以需要在IDEA中配置Git。 2.2 在IDEA中使用Git 2.2.1 获取Git仓库 在IDEA中使用Git获取仓库有两种方式: 本地初始化仓库从…

CentOS7 安装 Kamailio

https://www.kamailio.org/wiki/packages/rpms 官方文档说 yum -y install yum-utils yum-config-manager --add-repo https://rpm.kamailio.org/centos/kamailio.repo 但目前这样其实行不通 需要这样做&#xff1a; yum install --disablerepokamailio --enablerepokamai…

软件测试面试题学习

参考视频&#xff1a;软件测试面试——接口测试用例该怎么设计_哔哩哔哩_bilibili 1. 接口测试用例该怎么设计&#xff1f; a.功能测试用例的时候针对的是单接口&#xff0c;提交的一个各种正向或逆向的一些测试数据 b.业务测试用例&#xff0c;

Python异步编程之道:asyncio库的探索与应用

Python异步编程之道&#xff1a;asyncio库的探索与应用 一、引言 在Python编程中&#xff0c;异步编程是提高程序性能、处理高并发场景的重要技术。传统的同步编程模型在处理I/O密集型任务时&#xff0c;如网络请求、文件读写等&#xff0c;会导致CPU的空闲等待&#xff0c;从…

数据库出现死锁的解决方法参考

死锁引起的原因一般是多个用户并发访问数据库导致的问题&#xff0c;或是因为某个进程挂死以后资源未释放导致的。通过onstat –p可查看deadlks项大于0即表示历史总计死锁次数。对于被锁的表进行操作的时候会出现-143 ISAM error: deadlock detected的错误。当其他会话访问此表…

从JSON数据到Pandas DataFrame:如何解析出所需字段

目录 一、引言 二、JSON数据的基本结构 三、使用Pandas从JSON数据中读取数据 四、从DataFrame中解析出所需字段 解析对象字段 解析嵌套对象字段 解析数组字段 五、案例与代码示例 六、总结 一、引言 在数据分析和处理的日常工作中&#xff0c;我们经常需要从各种…

UBoat:一款功能强大的HTTP Botnet学习与研究工具

关于UBoat UBoat是一款功能强大的HTTP Botnet概念验证工具&#xff0c;该工具支持复刻一个现实场景中完整功能的Botnet测试环境&#xff0c;广大研究人员可以利用UBoat深入学习和研究Botnet的工作机制&#xff0c;以此来提升安全检测和保护策略。 功能介绍 1、基于C开发&…

luceda ipkiss教程 70:合并GDS版图

通过代码拼版&#xff1a; 所有代码如下&#xff1a; from si_fab import all as pdk from ipkiss3 import all as i3class Design1(i3.GDSCell):def _default_filename(self):return "Ring_Test.gds"def _default_name(self):return "Design1"class Des…

VTK官方例子

VTK官方例子 vtkMutableDirectedGraph #!/usr/bin/env python# noinspection PyUnresolvedReferences import vtkmodules.vtkInteractionStyle # noinspection PyUnresolvedReferences import vtkmodules.vtkRenderingOpenGL2 from vtkmodules.vtkCommonColor import vtkName…

EasyExcel自定义数据格式化

自定格式常量类 public class ExcelFormatConstants {public static final String DATE_FORMAT "yyyy-MM-dd";public static final String NUMBER_FORMAT_DEFAULT "#,##0.00";public static final String NUMBER_FORMAT_FOUR_DECIMAL "#,##0.0000…

Apache Flume事务

Apache Flume 中的事务处理是指 Flume Agent 在处理事件流时的一种机制&#xff0c;用于确保数据的可靠传输和处理。 1. 事务概述&#xff1a; Flume 中的事务是指一组事件的传输和处理&#xff0c;这些事件在传输过程中要么全部成功完成&#xff0c;要么全部失败&#xff0…

Jsp+Servlet实现图片上传和点击放大预览功能(提供Gitee源码)

前言&#xff1a;在最近老项目的开发中&#xff0c;需要做一个图片上传和点击放大的功能&#xff0c;在Vue和SpringBoot框架都有现成封装好的组件和工具类&#xff0c;对于一些上世纪的项目就没这么方便了&#xff0c;所以需要自己用原生的代码去编写&#xff0c;这里分享一下我…

01.Net基础知识

.Net的用途 Web、移动、云、桌面、游戏开发、物联网 &#xff08;IDE&#xff1a;集成开发环境&#xff09; .Net学习资源 Microsoft Learn、GitHub、G码云&#xff08;Gitee&#xff09; Visual Studio初步使用 1&#xff09;可创建的项目种类&#xff08;主要学习以下四…

JSON.parse()反序列化数据丢失

序列化&#xff1a;将数据转换为字符串的过程称为序列化。在序列化过程中&#xff0c;数据结构&#xff08;比如对象、数组等&#xff09;被转换成一个字符串形式&#xff0c;这个字符串通常以特定的格式表示&#xff0c;比如 JSON 或 XML。 反序列化&#xff1a;反序列化是序…