回文数拆分

题目:

题目描述
对一个正整数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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值