H. 試題H:擺動序列 25’
描述
如果一個序列的奇數項都比前一項大,偶數項都比前一項小,則稱為一個擺動序列。
即 a_{2i} < a_{2i-1}, a_{2i+1} > 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。
//弱化版 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; }