P1722 矩阵Ⅱ - 洛谷

题源:P1722 矩阵 II - 洛谷

看了题目之后,需要注意的是:

①在1 ~ i 个格子中红色数量  >=  黑色数量

②最后,在2 * n  个格子中,红色数量 == 黑色数量

根据这两个约束条件,可以知道,第一个格子必须是红色

第一种解法:动态规划

使用组合数学中递推思想

统计方案数目,就是最简单的动态规划。

可以按照下面的方法进行分析:

1. 问题建模

  • 问题描述
    在 2n 个算筹中放置 n 个红色算筹,满足 任意前 i 个算筹中红色算筹数 ≥ ⌈i/2⌉(即红色算筹始终不少于半数)。

  • DP状态定义
    dp[i][j] 表示前 i 个算筹中放置 j 个红色算筹的合法方案数。

2. 动态规划转移方程

  • 递推关系
    dp[i][j] = dp[i-1][j] + dp[i-1][j-1]

    • dp[i-1][j]:第 i 个算筹不选红色(即选黑色)。

    • dp[i-1][j-1]:第 i 个算筹选红色。

    • 在循环里面写着一步的时候就可以加上 模 100了。

  • 约束条件
    j ≥ ⌈i/2⌉,确保任意前缀中红色算筹数满足要求。

3. 算法核心逻辑

  1. 初始化
    dp[1][1] = 1,表示第一个算筹必须为红色(因为 ⌈1/2⌉ = 1)。

  2. 递推填充DP表

    • 外层循环遍历算筹总数 i(从 2 到 2n)。

    • 内层循环遍历红色算筹数 j(从 ⌈i/2⌉ 到 i)。

  3. 结果输出
    dp[2n][n] 表示 2n 个算筹中放 n 个红色算筹的合法方案数。

AC代码:

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
int dp[510][510];
int main()
{int n;cin>>n;dp[1][1] = 1;for(int i = 2;i <= 2 * n;i++){for(int j = 1;j <= i;j++){if(j >= (i + 1) / 2){dp[i][j] = (dp[i - 1][j] + dp[i - 1][j - 1]) % 100;}}}printf("%d",dp[2*n][n]);return 0;} 

第二种解法:卡特兰数

卡特兰数是一系列自然数,其第n项的公式为:

其中C0 = 1,        C1 = 1,         C2 = 2,          C3 = 5,          C4 = 14,          C5 = 42,        C6 = 132,       C7 = 429....

关于它的一些公式:

 有通项公式推出递推公式相对其他数学公式而言较简单,可以自证。

2.卡特兰数代码实现

    f[0] = f[1] = 1;for(int i = 2;i <= n;i++){for(int j = 0;j < i;j++){f[i] += f[j] * f[i - 1 - j]; // 递推公式2}}

3. 为什么这道题可以使用卡特兰数

因为卡特兰数常用场景是:

①出栈次序:假设有一个栈,将数字 1,2,…,n 按顺序依次入栈,允许在任意时刻出栈。求所有可能的 出栈序列 的总数。

②n对括号正确匹配问题:给定 n 对括号(即 n 个左括号 ( 和 n 个右括号 )),求所有 合法匹配的括号序列 的总数。

③给定节点组成二叉搜索树:给定 n 个不同的节点(值唯一),求能组成多少种 结构不同的二叉搜索树(BST)

所以,我们这道题就可以看成是出栈次序问题。就是求将红色看成是入栈操作,黑色看成是出栈操作。任意前缀(前面格子)中红色 >= 黑色,等价于 入栈数 >= 出栈数。这也是出栈序列中的合法性,保证入栈数大于等于出栈数。所以就可以看成是出栈次序问题。

下面讲解出栈次序问题:

①首先,设f(n)  为 序列个数中为 n 的出栈序列种数。

②并且假定,从开始到第一次出栈到空为止,这段过程中的第一个出栈序数为 k。

③首次出空 之前 第一个出栈的序数 k 将 1 ~ n 的序列分为两个序列:第一段序列是 1 ~ k - 1,第二段序列是 k + 1 ~ n.

④现在,把 k 看成是一个确定的序数,根据乘法原理,f(n) 的问题等价于 —— 序列个数为 k - 1 (第一段)的出栈序列数乘以序列个数为 n - k 的出栈序列数(递归思想),即f(n)  = f(k -1) * f(n - k);

⑤因为k的范围 是 1 ~ n,所以再结合 加法原理,将 k 取到不同值得序列种数相加,得到得总序列种数为:f(n)=f(0)f(n−1)+f(1)f(n−2)+……+f(n−1)f(0)。

⑥可以发现,这个公式与卡特兰数得递推式二  是一样的。

这道的解为 第 n 个卡特兰数。

AC代码:

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
long long int f[1200];
int main()
{int n;scanf("%d",&n);f[0] = f[1] = 1;for(int i = 2;i <= n;i++){for(int j = 0;j < i;j++){f[i] += f[j] * f[i - 1 - j];f[i] %= 100;}}printf("%lld",f[n]);return 0;} 

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

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

相关文章

数据库——MySQL基础操作

一、表结构与初始数据 假设存在以下两张表&#xff1a; 1. student 表 字段名数据类型描述idINT学生唯一标识符nameVARCHAR(100)学生姓名ageINT学生年龄sexVARCHAR(10)学生性别 初始数据&#xff1a; idnameagesex1张三20男2李四22女3王五21男 2. course 表 字段名数据类…

行业白皮书2025 | 益企研究院:AI时代的存储基石

在当今科技飞速发展的时代&#xff0c;AI技术已成为推动各行业变革的关键力量。日前&#xff0c;益企研究院重磅发布《AI时代的存储基石》白皮书。 下载方式&#xff1a;关注“渡江客涂鸦板”&#xff0c;回复st250326获取免费下载地址 数据需求与技术挑战&#xff1a; AI技术…

音视频新人如何快速上手nginx-rtmp-module

一、整体设计架构 nginx-rtmp-module 是 Nginx 的一个扩展模块&#xff0c;专门为 Nginx 添加了对 RTMP 协议的支持。其核心功能包括&#xff1a; RTMP推流&#xff08;publish&#xff09; RTMP拉流&#xff08;play&#xff09; 流转发&#xff08;relay&#xff09; 流录…

vue 封装 Axios菜鸟教程

1、Axios依赖下载 $ npm install axios 2、以下链接为Axios 的api Axios 实例 | Axios中文文档 | Axios中文网 3、 项目新建request.js&#xff0c;文件名称按照驼峰命名法就可以 4、封装request.js代码如下 import axios from "axios"//创建axios实例&#xff0…

[项目]基于FreeRTOS的STM32四轴飞行器: 十一.MPU6050配置与读取

基于FreeRTOS的STM32四轴飞行器: 十一.MPU6050 一.芯片介绍二.配置I2C三.编写驱动四.读取任务的测试五.MPU6050六轴数据的校准 一.芯片介绍 芯片应该放置在PCB中间&#xff0c;X Y轴原点&#xff0c;敏感度131表示范围越小越灵敏。理想状态放置在地面上X&#xff0c;Y&#xf…

iOS常见网络框架

URLSession、Alamofire 和 Moya 1. URLSession 1.1 核心概念 URLSession 是 Apple 官方提供的网络请求 API&#xff0c;封装在 Foundation 框架中。它支持 HTTP、HTTPS、FTP 等协议&#xff0c;可用于&#xff1a; ​ • 普通网络请求&#xff08;GET/POST&#xff09; ​ …

AOA(到达角度)与TOA(到达时间)两个技术的混合定位,MATLAB例程,自适应基站数量,三维空间下的运动轨迹,滤波使用UKF(无迹卡尔曼滤波)

本文介绍一个MATLAB代码,实现了三维动态目标非线性定位与滤波系统,通过融合 到达角(AOA) 和 到达时间(TOA) 的混合定位方法,结合 无迹卡尔曼滤波(UKF) 处理非线性观测模型,优化轨迹精度。代码支持自适应基站数量配置,适用于复杂非线性场景的定位研究。 文章目录 运行…

Ubuntu 重置密码方法

目录 修改过 root 密码&#xff0c;重置密码的方法没改过 root 密码‌&#xff0c;重置密码的方法 修改过 root 密码&#xff0c;重置密码的方法 Ubuntu 默认禁用root用户&#xff0c;意思就是安装好Ubuntu系统后&#xff0c;root用户默认是没有密码的&#xff0c;普通用户通过…

Leetcode 路径总和 III

java 解法一&#xff1a;双递归 class Solution {public int pathSum(TreeNode root, long targetSum) { //外层递归,把每个节点都当作路径起点if(root null) return 0;int ret rootSum(root, targetSum);ret pathSum(root.left, targetSum);ret pathSum(root.right, targ…

WEB安全--SQL注入--利用log写入webshell

一、原理&#xff1a; 这也是对之前文章的补充&#xff1a;WEB安全--SQL注入--INTO OUTFILE-CSDN博客 我们可以通过修改MySQL的log文件&#xff0c;用select关键字写入木马文件放在服务器物理地址中&#xff0c;通过访问物理地址getshell。 二、条件&#xff1a; 用户有写入权限…

C++11中引入的比较常用的新特性讲解(上)

目录 1、C11简介 2、统一的列表初始化 2.1、&#xff5b;&#xff5d;初始化 2.2、std::initializer_list 3、变量类型推导 3.1、auto 3.2、decltype 3.3、nullptr 4、范围for循环 5、STL中一些变化 6、右值引用和移动语义 6.1、左值引用和右值引用 6.2、右值引用…

hugo+github pages 部署实验室网站

&#xff01;&#xff01;太爽了&#xff0c;看了很久教程&#xff0c;自己试了好久&#xff0c;终于搞懂怎么把hugo和public单独进行部署了&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 目的是什么&#xff1f;目的当然是为了修改这天杀的hugo的模板。现在…

两头文件互引问题解决(前置声明)

问题&#xff1a; 想必正在基础阶段学习的朋友们都遇见过以下问题吧 widget.h otherwidget.h 如上问题是&#xff0c;我在widget.h中引用了otherwidget.h ,在ohterwidget中又引用了widget.h&#xff0c;两个头文件互相引用产生了报错 解决办法&#xff1a; 那么我们该如何解…

Python 异常处理完全指南

目录 一、异常处理基础1. 基本语法结构 二、常见异常类型1. 内置异常层次2. 常见异常示例 三、多重异常处理1. 合并捕获2. 分层处理 四、finally与else子句1. finally 应用场景2. else 使用技巧 五、自定义异常1. 创建异常类2. 异常继承体系 六、异常链与上下文1. raise from 语…

【Qt】Ubuntu22.04使用命令安装Qt5和Qt6

1、安装Qt5 注意:Ubuntu22.04已经没有 qt5-default ,因此不能一键安装啦 1)安装核心组件 sudo apt install qtbase5-dev qtchooser qt5-qmake qtcreator2)安装QtCreator sudo apt install qtcreator3)安装工具包、Qt Quick 开发的核心库(qtdeclarative5-dev) sudo a…

手撸一个 deepseek 数据库对话,打造一个企业智能通讯录(ollama + deepseek + langchain)

前言 由于 deepseek 等大语言模型数据时效性问题&#xff0c;无法跟上现实世界信息的动态变化&#xff0c;企业内部信息更是无法理解&#xff0c;为了将 deepseek 应用到企业内部&#xff0c;之前有写过通过联网搜索、上传文件、搭建知识等检索增强生成&#xff08;RAG&#xf…

线段树SegmentTree

线段树当中的几个重要操作 1.PushUp 上推操作&#xff1a;由子节点算父节点的信息 p u s h u p push up pushup 操作的目的是为了维护父子节点之间的逻辑关系。当我们递归建树时&#xff0c;对于每一个节点我们都需要遍历一遍&#xff0c;并且电脑中的递归实际意义是先向底层…

SSH免密登录服务器方法

Window免密连接Linux系统 生成公匙 ssh-keygen -t rsa一路回车生成公钥 复制公匙&#xff0c;使用记事本打开复制全部内容 notepad C:\Users\DELL\.ssh\id_rsa.pub内容如"ssh-rsa AAAAB3NzaC1yc2EAAAA…" 远程登录服务器将内容写入~/.ssh/authorized_keys echo …

Go 1.24 新特性解析:泛型类型别名、弱指针与终结器改进

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…

MySQL 表 t1 建立联合索引 (a, b, c),在 where a < ? and b > ? and c < ? 中哪些索引生效

文章目录 联合索引 abc 均范围扫描时的索引生效情况无回表 表数据量非常少无回表 表数据量多有回表总结 联合索引 abc 均范围扫描时的索引生效情况 场景&#xff1a;表 t1 建立联合索引 (a, b, c)&#xff0c;在 where a < ? and b > ? and c < ? 中哪些索引生效…