[藍橋杯]擺動序列

擺動序列

題目描述

如果一個序列的奇數項都比前一項大,偶數項都比前一項小,則稱為一個擺動序列。即?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
繁體地址,請注明出處:http://hk.pswp.cn/news/908322.shtml
英文地址,請注明出處:http://en.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…