问题描述
如果一个序列的奇数项都比前一项大,偶数项都比前一项小,则称为一个摆动序列。即 a[2i]<a[2i-1], a[2i+1]>a[2i]。
小明想知道,长度为 m,每个数都是 1 到 n 之间的正整数的摆动序列一共有多少个。
输入
3 4
输出
14
#include<iostream>
using namespace std;
int a[1010][1010];
int n,m;
/* * * * a[i][j]的意义:
* i&1==0 即i为偶数时,表示第i项小于等于j的方案数
* i&1==1 即i为奇数时,表示第i项大于等于j的方案数
* 先初始化,第一项是奇数项,dp[1][j]=n-j+1; 大于等于j的选择方案总数
* 从第2项到第m项:
* * 如果i&1==0,偶数项,dp[i][j]表示小于等于j的方案数,不难想出递推关系:
* dp[i][j]=dp[i-1][j+1]+dp[i][j-1];
* 要先知道dp[i][j-1]所以j从小到大递推
* * 如果i&1==1,奇数项,要找大于等于j的方案数,递推关系:
* dp[i][j]=dp[i-1][j-1]+dp[i][j+1]
* 要先求出dp[i][j+1],所以j要从大到小
* * * *最后结果:如果是奇数项即求出第i位大于等于1小于等于n的总方案数,即dp[m][1]
* * * * 如果是偶数项,求出第i位小于等于n的总方案数,即dp[m][n]
*/
int main(){
cin>>m>>n;
for(int i=1;i<=n;i++)
a[1][i]=n-i+1;
for(int i=2;i<=m;i++){
if(i&1){
for(int j=n;j>=1;j--)
a[i][j]=a[i-1][j-1]+a[i][j+1];
}else{
for(int j=1;j<=n;j++)
a[i][j]=a[i-1][j+1]+a[i][j-1];
}
}
cout<<((m&1)?(a[m][1]):(a[m][n]))<<endl;
return 0;
}