H. 試題H:擺動序列 25'


 

 

H. 試題H:擺動序列 25’

描述

如果一個序列的奇數項都比前一項大,偶數項都比前一項小,則稱為一個擺動序列。

a_{2i} < a_{2i-1}, a_{2i+1} > a_{2i}

小明想知道,長度為 m,每個數都是 1n 之間的正整數的擺動序列一共有多少個。

輸入

輸入一行包含兩個整數 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

 

 

//弱化版 NOIP2013 花匠 (原思路:貪心 / 動態規划) 
//f[n][m] 以n結尾,長度為m的方案數
//f[i][j]=sigma(f[t][j-1]),t<i
//轉移用下前綴和優化 
#include<iostream>
using namespace std;
const int N=1005,mod=10000;
int n,m,ans,f[N][N];
int main(){
    cin>>m>>n;
    for(int i=1;i<=n;i++) f[i][1]=1;
    //以i結尾長度為1
    for(int j=2;j<=m;j++){
        int sum=0;
        if(j&1){//奇數項,加前面的
            for(int i=1;i<=n;i++){
                (f[i][j]+=sum)%=mod;
                (sum+=f[i][j-1])%=mod;
            }
        }
        else{//偶數項,加前面的
            for(int i=n;i>=1;i--){
                (f[i][j]+=sum)%=mod;
                (sum+=f[i][j-1])%=mod;
            }
        }
    }
    for(int i=1;i<=n;i++) (ans+=f[i][m])%=mod;
    cout<<ans;
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM