问题描述:如果一个序列满足下面的性质,我们就将它称为摆动序列:
1. 序列中的所有数都是不大于 k 的正整数;
2. 序列中至少有两个数。
3. 序列中的数两两不相等;
4. 如果第 i – 1 个数比第 i – 2 个数大, 则第 i 个数比第 i – 2 个数小; 如果第 i – 1 个数比
第 i – 2 个数小,则第 i 个数比第 i – 2 个数大。
比如,当 k = 3 时,有下面几个这样的序列:
1 2
1 3
2 1
2 1 3
2 3
2 3 1
3 1
3 2
一共有 8 种,给定 k,请求出满足上面要求的序列的个数。
输入格式:输入包含了一个整数 k。 (k<=20)
输出格式:输出一个整数,表示满足要求的序列个数。
样例输入
3
样例输出
1. 序列中的所有数都是不大于 k 的正整数;
2. 序列中至少有两个数。
3. 序列中的数两两不相等;
4. 如果第 i – 1 个数比第 i – 2 个数大, 则第 i 个数比第 i – 2 个数小; 如果第 i – 1 个数比
第 i – 2 个数小,则第 i 个数比第 i – 2 个数大。
比如,当 k = 3 时,有下面几个这样的序列:
1 2
1 3
2 1
2 1 3
2 3
2 3 1
3 1
3 2
一共有 8 种,给定 k,请求出满足上面要求的序列的个数。
输入格式:输入包含了一个整数 k。 (k<=20)
输出格式:输出一个整数,表示满足要求的序列个数。
样例输入
3
样例输出
8
//***********************摆动序列3_9
#include <iostream>
using namespace std;
int main()
{
int n,i,a[30],sum=0;
cin >> n;
a[2]=2;
sum+=a[2];
for(i=3;i<=n;i++)
{
a[i]=sum+i*(i-1);
sum+=a[i];
}
cout << a[n];
return 0;
}
#include <iostream>
using namespace std;
int count(int n,int m)
{
int c1=1,c2=1;
for(int i=n;i>=n-m+1;i--)
c1*=i;
for(int j=m;j>=1;j--)
c2*=j;
return c1/c2;
}
int main()
{
int n;
cin >> n;
int sum=0;
for(int i=2;i<=n;i++)
{
sum+=count(n,i); //计算C(n,i) 2~n得值的和
}
sum*=2;
cout << sum;
return 0;
}