蓝桥 摆动序列 (dp)

简介: 蓝桥 摆动序列 (dp)

问题描述
如果一个序列的奇数项都比前一项大,偶数项都比前一项小,则称为一个摆动序列。即 a[2i]a[2i]。
小明想知道,长度为 m,每个数都是 1 到 n 之间的正整数的摆动序列一共有多少个。
输入格式
输入一行包含两个整数 m,n。
输出格式
输出一个整数,表示答案。答案可能很大,请输出答案除以10000的余数。
样例输入
3 4
样例输出
14
样例说明
以下是符合要求的摆动序列:
  2 1 2
  2 1 3
  2 1 4
  3 1 2
  3 1 3
  3 1 4
  3 2 3
  3 2 4
  4 1 2
  4 1 3
  4 1 4
  4 2 3
  4 2 4
  4 3 4
评测用例规模与约定
对于 20% 的评测用例,1 <= n, m <= 5;
对于 50% 的评测用例,1 <= n, m <= 10;
对于 80% 的评测用例,1 <= n, m <= 100;
对于所有评测用例,1 <= n, m <= 1000。

比赛的时候用的暴力搜索,应该是得不了多少分。
看了好几个题解才看明白动态规划怎么做,这里记录一下,都在注释里了。

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

//i表示第几位

//i为奇数-->dp[i][j]:第i位是大于等于j的个数
//dp[i][j]=dp[i-1][j-1]+dp[i][j+1]

//i为偶数-->dp[i][j]:第i位是小于等于j的个数
//dp[i][j]=dp[i-1][j+1]+dp[i][j-1]
int dp[1005][1005];
int n, m;
int main(){
   
    cin>>m>>n;
    for (int j=1; j<=n; j++){
   
        dp[1][j]=n-j+1;
    }
    for (int i=2; i<=m; i++){
   
        if (i&1){
   
            for (int j=n; j>=1; j--){
   
                dp[i][j]=(dp[i-1][j-1]+dp[i][j+1])%10000;
            }
        }else{
   
            for (int j=1; j<=n; j++){
   
                dp[i][j]=(dp[i-1][j+1]+dp[i][j-1])%10000;
            }
        }
    }
    int res = m&1? dp[m][1] : dp[m][n];
    cout<<res;
    return 0;
}
相关文章
|
8月前
|
存储 算法
《LeetCode》—— 摆动序列
《LeetCode》—— 摆动序列
|
8月前
|
Java
leetcode-376:摆动序列
leetcode-376:摆动序列
49 0
|
8月前
【每日一题Day114】LC1223 掷骰子模拟 | 记忆化搜索+dp
【每日一题Day114】LC1223 掷骰子模拟 | 记忆化搜索+dp
61 0
|
8月前
力扣 790. 多米诺和托米诺平铺(一维dp)
力扣 790. 多米诺和托米诺平铺(一维dp)
|
8月前
【编程题-错题集】连续子数组最大和(动态规划 - 线性 dp)
【编程题-错题集】连续子数组最大和(动态规划 - 线性 dp)
|
8月前
|
算法
leetcode代码记录(摆动序列
leetcode代码记录(摆动序列
35 0
|
8月前
【每日一题Day126】LC1140石子游戏Ⅱ | 博弈dp 记忆化搜索
【每日一题Day126】LC1140石子游戏Ⅱ | 博弈dp 记忆化搜索
57 0
消失的数字,旋转数组(leetcode 一题多解)
消失的数字,旋转数组(leetcode 一题多解)
|
算法
【学会动态规划】摆动序列(27)
【学会动态规划】摆动序列(27)
58 0
|
算法 Android开发
LeetCode 周赛上分之旅 #41 结合离散化的线性 DP 问题
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
77 0