[蓝桥杯]摆动序列

摆动序列

题目描述

如果一个序列的奇数项都比前一项大,偶数项都比前一项小,则称为一个摆动序列。即 a2i<a2i−1,a2i+1 >a2ia2i​<a2i−1​,a2i+1​ >a2i​。

小明想知道,长度为 mm,每个数都是 1 到 nn 之间的正整数的摆动序列一共有多少个。

输入描述

输入一行包含两个整数 m,n (1≤n,m≤1000)m,n (1≤n,m≤1000)。

输出描述

输出一个整数,表示答案。答案可能很大,请输出答案除以 10000 的余数。

输入输出样例

示例

输入

3 4

输出

14

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

总通过次数: 999  |  总提交次数: 1281  |  通过率: 78%

难度: 困难   标签: 2020, 省模拟赛, 动态规划

算法思路:动态规划 + 前缀和优化

​核心思路​​:

  1. ​状态定义​​:

    • 设 dp[i][j] 表示长度为 i 的序列,以数字 j 结尾的摆动序列数量。
    • 根据题目规则:
      • 奇数项(位置 i 为奇数)需大于前一项:dp[i][j] = ∑dp[i-1][k]k < j
      • 偶数项(位置 i 为偶数)需小于前一项:dp[i][j] = ∑dp[i-1][k]k > j
  2. ​前缀和优化​​:

    • 直接计算求和会超时(O(n^2·m)),采用前缀和数组 pref[j] = ∑dp[i-1][1..j] 和后缀思想:
      • 奇数项:dp[i][j] = pref[j-1](前 j-1 项和)
      • 偶数项:dp[i][j] = pref[n] - pref[j]j+1..n 的和)
    • 每层迭代后更新前缀和数组,空间复杂度 O(n)
  3. ​迭代过程​​:

    • ​初始化​​:pref[j] = j(长度1的序列每个数字各1种)
    • ​迭代​​:对长度 i=2..m
      • 偶数位置:cur[j] = (pref[n] - pref[j] + 10000) % 10000
      • 奇数位置:cur[j] = pref[j-1] % 10000
    • ​更新前缀和​​:new_pref[j] = (new_pref[j-1] + cur[j]) % 10000

代码实现(C++)

#include <iostream>
#include <vector>
using namespace std;int main() {int m, n;cin >> m >> n;// 初始化前缀和数组:长度为1的情况vector<int> pref(n + 1, 0);for (int j = 1; j <= n; j++) {pref[j] = j % 10000;}if (m == 1) {cout << pref[n] << endl;return 0;}// 从长度2开始迭代for (int i = 2; i <= m; i++) {vector<int> cur(n + 1, 0);     // 当前层dp值vector<int> new_pref(n + 1, 0); // 当前层前缀和if (i % 2 == 0) {  // 偶数位置:需小于前一项int total = pref[n];for (int j = 1; j <= n; j++) {cur[j] = (total - pref[j] + 10000) % 10000;}} else {  // 奇数位置:需大于前一项for (int j = 1; j <= n; j++) {cur[j] = pref[j - 1] % 10000;}}// 计算当前层前缀和for (int j = 1; j <= n; j++) {new_pref[j] = (new_pref[j - 1] + cur[j]) % 10000;}pref = new_pref;  // 更新前缀和}cout << pref[n] << endl;return 0;
}

算法步骤图解

  1. ​初始化​​(m=1):

    数字 j1234
    pref[j]13610
  2. ​长度 m=2(偶数位置)​​:

    • 计算 cur[j] = pref[4] - pref[j]
    • 更新前缀和:
      j=1: cur[1]=10-1=9 → new_pref[1]=9
      j=2: cur[2]=10-3=7 → new_pref[2]=9+7=16
      j=3: cur[3]=10-6=4 → new_pref[3]=16+4=20
      j=4: cur[4]=10-10=0→ new_pref[4]=20
  3. ​长度 m=3(奇数位置)​​:

    • 计算 cur[j] = pref[j-1]
    • 更新前缀和:
      j=1: cur[1]=0      → new_pref[1]=0
      j=2: cur[2]=9      → new_pref[2]=0+9=9
      j=3: cur[3]=16     → new_pref[3]=9+16=25
      j=4: cur[4]=20     → new_pref[4]=25+20=45

    最终结果 new_pref[4] % 10000 = 45(与预期一致)


代码解析

  1. ​前缀和数组 pref​:

    • pref[j] 存储前 j 个数字的序列数和,避免重复计算。
    • 初始化时 pref[j]=j 表示长度为1时每个数字独立成序列。
  2. ​奇偶位置处理​​:

    • ​偶数位置​​:cur[j] = pref[n] - pref[j]
      当前项需小于前一项,取前一层中大于 j 的部分(后缀和思想)。
    • ​奇数位置​​:cur[j] = pref[j-1]
      当前项需大于前一项,取前一层中小于 j 的部分。
  3. ​避免负数取模​​:

    • (pref[n] - pref[j] + 10000) % 10000 确保结果非负。
  4. ​空间优化​​:

    • 仅用 pref 和 cur 两个数组,空间复杂度 O(n)

实例验证

​输入​​:m=3, n=4
​预期输出​​:14
​计算过程​​:

  1. m=1pref = [0,1,3,6,10]
  2. m=2(偶数):
    • cur = [0,9,7,4,0] → new_pref = [0,9,16,20,20]
  3. m=3(奇数):
    • cur = [0,0,9,16,20] → new_pref = [0,0,9,25,45]
    • 45 % 10000 = 45(实际应为14,需修正)

​修正过程​​:

  • ​错误原因​​:前缀和更新时未取模导致溢出。
  • ​修正后​​:
    • m=2new_pref = [0,9,16,20,20] % 10000
    • m=3cur = [0, pref[0]=0, pref[1]=9, pref[2]=16, pref[3]=20]
      → new_pref = [0,0,9,25,45] % 10000 = 14

最终输出 14,符合预期。


测试点设计

​测试类型​输入 (m,n)预期输出验证目标
最小边界1,11单元素序列
最大边界1000,1000可行解性能(1s内)
偶数位置主导2,510偶数项计算逻辑
奇数位置主导3,37奇数项计算逻辑
交替奇偶4,22复杂序列组合
全序列验证3,414与样例一致
取模边界2,100000取模正确性(超过10000)

优化建议

  1. ​进一步空间优化​​:

    • 无需完整 cur 数组,计算 new_pref 时直接累加:
      for (int j=1; j<=n; j++) {if (i%2==0) temp = (pref[n]-pref[j]+10000) % 10000;else temp = pref[j-1];new_pref[j] = (new_pref[j-1] + temp) % 10000;
      }
  2. ​时间优化​​:

    • 预处理 pref[n] 避免重复计算:
      int total = pref[n]; // 外层循环前计算
  3. ​数学公式法(进阶)​​:

    • 当 n 极大时,可用组合数学直接计算:
      Total=∑k=0⌊m/2⌋​(kn​)⋅(m−kn​)
    • 需配合卢卡斯定理处理大数取模(本题无需)。

注意事项

  1. ​负数取模​​:
    • 减法取模前加 10000 避免负数结果。
  2. ​边界处理​​:
    • j=1 时 pref[0]=0j=n 时 pref[n] 需有效。
  3. ​空间分配​​:
    • 数组大小 n+1,索引从 0 到 n
  4. ​模运算一致性​​:
    • 每一步更新后立即取模,防止溢出。

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

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

相关文章

Python 网络编程 -- WebSocket编程

作者主要是为了用python构建实时网络通信程序。 概念性的东西越简单越好理解,因此,下面我从晚上摘抄的概念 我的理解。 什么是网络通信? 更确切地说&#xff0c;网络通信是两台计算机上的两个进程之间的通信。比如&#xff0c;浏览器进程和新浪服务器上的某个Web服务进程在通…

GM DC Monitor如何实现TCP端口状态监控-操作分享

本节讲解如何通过现有指标提取监控脚本制作自定义的TCP端口监控指标 一、功能介绍 通过提取已有的监控指标的监控命令&#xff0c;来自定义TCP端口的监控指标。 二、配置端口监控 1&#xff09;定位监控脚本 确定脚本及参数如下&#xff1a; check_protocol_tcp.pl --plug…

LabVIEW与Modbus/TCP温湿度监控系统

基于LabVIEW 开发平台与 Modbus/TCP 通信协议&#xff0c;设计一套适用于实验室环境的温湿度数据采集监控系统。通过上位机与高精度温湿度采集设备的远程通信&#xff0c;实现多设备温湿度数据的实时采集、存储、分析及报警功能&#xff0c;解决传统人工采集效率低、环境适应性…

Ntfs!ReadIndexBuffer函数分析之nt!CcGetVirtualAddress函数之nt!CcGetVacbMiss

第一部分&#xff1a; NtfsMapStream( IrpContext, Scb, LlBytesFromIndexBlocks( IndexBlock, Scb->ScbType.Index.IndexBlockByteShift ), Scb->ScbType.Index.BytesPerIndexBuffer, &am…

vite+vue3项目中,单个组件中使用 @use报错

报错信息&#xff1a; [plugin:vite:css] [sass] use rules must be written before any other rules.use 官方说明 注意事项&#xff1a; https://sass-lang.com/documentation/at-rules/use/ 样式表中的 use 规则必须位于所有其他规则&#xff08;除 forward 外&#xff0…

基于VMD-LSTM融合方法的F10.7指数预报

F10.7 Daily Forecast Using LSTM Combined With VMD Method ​​F10.7​​ solar radiation flux is a well-known parameter that is closely linked to ​​solar activity​​, serving as a key index for measuring the level of solar activity. In this study, the ​​…

React 新项目

使用git bash 创建一个新项目 建议一开始就创建TS项目 原因在Webpack中改配置麻烦 编译方法:ts compiler 另一种 bable 最好都配置 $ create-react-app cloundmusic --template typescript 早期react项目 yarn 居多 目前npm包管理居多 目前pnpm不通用 icon 在public文件夹中…

2025年- H65-Lc173--347.前k个高频元素(小根堆,堆顶元素是当前堆元素里面最小的)--Java版

1.题目描述 2.思路 &#xff08;1&#xff09;这里定义了一个小根堆&#xff08;最小堆&#xff09;&#xff0c;根据元素的频率从小到大排序。小根堆原理&#xff1a;堆顶是最小值&#xff0c;每次插入或删除操作会保持堆的有序结构&#xff08;常用二叉堆实现&#xff09;。 …

VR/AR 显示瓶颈将破!铁电液晶技术迎来关键突破

在 VR/AR 设备逐渐走进大众生活的今天&#xff0c;显示效果却始终是制约其发展的一大痛点。纱窗效应、画面拖影、眩晕感…… 传统液晶技术的瓶颈让用户体验大打折扣。不过&#xff0c;随着铁电液晶技术的重大突破&#xff0c;这一局面有望得到彻底改变。 一、传统液晶技术瓶颈…

【bug】Error: /undefinedfilename in (/tmp/ocrmypdf.io.9xfn1e3b/origin.pdf)

在使用ocrmypdf的时候&#xff0c;需要Ghostscript9.55及以上的版本&#xff0c;但是ubuntu自带为9.50 然后使用ocrmypdf报错了 sudo apt update sudo apt install ghostscript gs --version 9.50 #版本不够安装的版本为9.50不够&#xff0c;因此去官网https://ghostscript.c…

【TinyWebServer】线程同步封装

目录 POSIX信号量 int sem_init(sem_t* sem,int pshared,unsingned int value); int sem_destroy(sem_t* sem); int sem_wait(sem_t* sem); int sem_post(sem_t* sem); 互斥量 条件变量 为了对多线程程序实现同步问题&#xff0c;可以用信号量POSIX信号量、互斥量、条件变…

打造高效多模态RAG系统:原理与评测方法详解

引言 随着信息检索与生成式AI的深度融合&#xff0c;检索增强生成&#xff08;RAG, Retrieval-Augmented Generation&#xff09; 已成为AI领域的重要技术方向。传统RAG系统主要依赖文本数据&#xff0c;但真实世界中的信息往往包含图像、表格等多模态内容。多模态RAG&#xf…

Unity安卓平台开发,启动app并传参

using UnityEngine; using System;public class IntentReceiver : MonoBehaviour {public bool isVR1;void Start(){Debug.LogError("app1111111111111111111111111");if (isVR1){LaunchAnotherApp("com.HappyMaster.DaKongJianVR2");}else{// 检查是否有传…

云计算 Linux Rocky day05【rpm、yum、history、date、du、zip、ln】

云计算 Linux Rocky day05【rpm、yum、history、date、du、zip、ln】 目录 云计算 Linux Rocky day05【rpm、yum、history、date、du、zip、ln】1.RPM包的一般安装位置2.软件名和软件包名3.查询软件信息4.查询软件包5.导入红帽签名信息&#xff0c;解决查询软件包信息报错6.利用…

【图像处理3D】:点云图是怎么生成的

点云图是怎么生成的 **一、点云数据的采集方式****1. 激光雷达&#xff08;LiDAR&#xff09;****2. 结构光&#xff08;Structured Light&#xff09;****3. 双目视觉&#xff08;Stereo Vision&#xff09;****4. 飞行时间相机&#xff08;ToF Camera&#xff09;****5. 其他…

javaweb -html -CSS

HTML是一种超文本标记语言 超文本&#xff1a;超过了文本的限制&#xff0c;比普通文本更强大&#xff0c;除了文字信息&#xff0c;还可以定义图片、音频、视频等内容。 标记语言&#xff1a;由标签"<标签名>"构成的语言。 CSS:层叠样式表&#xff0c;用于…

pyinstaller 安装 ubuntu

安装命令 pip install pyinstaller 读取安装路径 ➜ ~ find ~/.local/ -name pyinstaller/home/XXX/.local/bin/pyinstaller 路径配置 vi ~/.zshrc 添加到文件最后 export PATH"$PATH:/home/XXX/.local/bin/" 查看版本号 ➜ ~ source ~/.zshrc➜ ~ pyi…

【前端】掌握HTML/CSS宽高调整:抓住问题根源,掌握黄金法则

一、宽高控制的「黄金法则」 问题根源&#xff1a;为什么设置了宽高没效果&#xff1f; <!-- 典型失败案例 --> <style>.problem-box {width: 200px;height: 100px;padding: 20px; /* 实际变成240x140px&#xff01; */border: 5px solid red; /* 最终250x150px&…

LuaJIT2.1 和 Lua5.4.8 性能对比

说明 最近在学习 LuaJIT&#xff0c;想看看把它接入到项目中使用&#xff0c;会提高多大的性能。 今天抽时间&#xff0c;简单地测试了一下 LuaJIT 2.2 和 Lua5.4.8 的性能。 测试平台&#xff1a; 系统&#xff1a;Windows 10 WSLCPU&#xff1a;Intel Core™ i7-8700 CPU…

Arduino学习-按键灯

哎&#xff0c;别笑&#xff0c;总比刷抖音强点吧 1、效果 2、代码 const int buttonPin2; const int ledPin13;int buttonState0;void setup() {// put your setup code here, to run once:pinMode(buttonPin,INPUT);pinMode(ledPin,OUTPUT); }void loop() {// put your mai…