题目:
题目描述
对一个正整数K,求出K的所有拆分,并统计输出其中回文数列的个数。 所谓回文数列是指该数列中的所有数字,从左向右或从右向左看都相同。 例如:
K=4时,有如下的拆分:
4=1+1+1+1 (回文数列1)
=1+1+2
=1+2+1 (回文数列2)
=2+1+1
=2+2 (回文数列3)
=1+3
=3+1
输入输出格式
输入格式:
一个正整数K(1<=K<=26)
输出格式:
满足条件的拆分回文数列的个数。
输入输出样例
输入样例#1:
4
输出样例#1:
3
思路:
摘——
每个数必须被分成3部分。
以4为例:4=1+2+1,我们发现中间的数字只能是偶数,即2和0,为2的时候有1种数列,0的时候有2种数列。
再来研究一下6,当为4的时候有1种,为2的时候有2种,为0的时候有4种。
最后看一下5,情况和4非常的相似,只是中间的数字只能是奇数。
就是令f[i]为i的拆分可能的情况,如果i为奇数,f[i]=f[i-1],i为偶数,f[i]=f[i-1]*2+1
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 10000
int n;
long long f[maxn+5]={0};
int main(){
scanf("%d",&n);
for(int i=2;i<=n;i++){
if(i&1) f[i]=f[i-1];
else f[i]=2*f[i-1]+1;
}
printf("%lld",f[n]);
return 0;
}