蓝桥 摆动序列 (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;
}
相关文章
|
3月前
|
存储 算法
《LeetCode》—— 摆动序列
《LeetCode》—— 摆动序列
|
3月前
|
Java
leetcode-376:摆动序列
leetcode-376:摆动序列
34 0
|
11月前
【动态规划刷题 13】最长递增子序列&& 摆动序列
【动态规划刷题 13】最长递增子序列&& 摆动序列
|
3月前
【错题集-编程题】删除相邻数字的最大分数(动态规划 - 线性 dp)
【错题集-编程题】删除相邻数字的最大分数(动态规划 - 线性 dp)
|
3月前
【编程题-错题集】连续子数组最大和(动态规划 - 线性 dp)
【编程题-错题集】连续子数组最大和(动态规划 - 线性 dp)
|
3月前
|
算法 测试技术 C#
【动态规划】【 数位dp】2827. 范围中美丽整数的数目
【动态规划】【 数位dp】2827. 范围中美丽整数的数目
|
12月前
蓝桥 最大子矩阵 (dp)
蓝桥 最大子矩阵 (dp)
|
10月前
|
算法
【学会动态规划】摆动序列(27)
【学会动态规划】摆动序列(27)
31 0
|
算法 C++
每日算法系列【LeetCode 376】摆动序列
每日算法系列【LeetCode 376】摆动序列
leetcode每日一题:376. 摆动序列
leetcode每日一题:376. 摆动序列