poj 1221 UNIMODAL PALINDROMIC DECOMPOSITIONS 整数拆分

题意:

给一个数n,求有多少种和为n的单峰先增对称序列,比如当n=5时结果为3:(5), (1 3 1), (1 1 1 1 1)。

分析:

转化为求类似整数拆分问题,f(i,j)的意义是把i进行拆分,最大数小于等于j的方法数。

代码:

//poj 1221
//sep9
#include <iostream>
using namespace std;
const int maxN=300;
__int64 a[maxN+10][maxN+10];

__int64 f(int m,int n)
{
	if(a[m][n]!=-1)
		return a[m][n];
	if(m==1||n==1)
		return a[m][n]=1;
	if(n>m)
		return a[m][n]=f(m,m);
	else if(n==m)
		return a[m][n]=f(m,n-1)+1;
	else
		return a[m][n]=f(m,n-1)+f(m-n,n);
}

int main()
{
	memset(a,-1,sizeof(a));
	int n;
	while(scanf("%d",&n)==1&&n){
		__int64 sum=1;
		for(int mid=1;mid<n;++mid){
			if((n-mid)%2==0)
				sum+=f((n-mid)/2,mid);
		}
		if(n%2==0)
			sum+=f(n/2,n/2);
		printf("%d %I64d\n",n,sum);
	}
	return 0;
} 
时间: 2024-12-14 18:48:23

poj 1221 UNIMODAL PALINDROMIC DECOMPOSITIONS 整数拆分的相关文章

poj 1221 UNIMODAL PALINDROMIC DECOMPOSITIONS (母函数)

/* 给出一个数n,把它拆分成若干个数的和,要求最大的数在中间并向两边非递增.问拆法有多少种. 母函数.枚举中间的那一个数,因为左右对称,所以只需要求左边部分的方案即可. 注意,左右两部分的取数必须小于中间的数,中间的数是0的话则以n为最大取值. */ # include <stdio.h> # include <algorithm> # include <string.h> # include <iostream> typedef long long LL

poj 算法基础 编程题#1:UNIMODAL PALINDROMIC DECOMPOSITIONS

编程题#1:UNIMODAL PALINDROMIC DECOMPOSITIONS 来源: POJ(Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 A sequence of positive integers is Palindromic if it reads the same forward and backward. For example: 23 11 15 1 37 37 1 1

POJ 1365 Prime Land(整数拆分)

题意:感觉题意不太好懂,题目并不难,就是给一些p和e,p是素数,e是指数,然后把这个数求出来,设为x,然后让我们逆过程输出x-1的素数拆分形式,形式与输入保持一致. 思路:素数打表以后正常拆分即可. 注意:输入过程需要优化,我以前经常使用字符串模拟的方式,后来发现那种方法比较笨,还是下面的方法简洁:代码如下: #include<iostream> #include<cstdio> #include<cmath> #include<cstring> using

poj 1221

J - UNIMODAL PALINDROMIC DECOMPOSITIONS Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1221 Appoint description:  System Crawler  (2014-11-16) Description A sequence of positive integers is Pal

poj 3014 Cake Pieces and Plates 整数拆分

题意: 将m拆成n个数,允许某个数为0,求拆分方案数. 分析: 裸的整数拆分,设h(m,n)表示将m拆成n个数,允许某数为0的方案数,递推方程见代码.很有意思的是,参考上一篇写poj1221的博文中,设f(m,n)表示将m进行任意份数不允许有0的整数拆分,且最大元素小于等于m的方案数,则h(m,n)==f(m,n)....求解此等式意义... 代码: //poj 3014 //sep9 #include <iostream> using namespace std; const int max

poj 2229 完全背包变形(求解整数拆分问题)

整数拆分问题:给定一个正整数n,将n拆分为若干数字的和,问有多少种方法? 此题为整数拆分问题的子问题,拆分出的数字要求是2的幂次. 定义dp[i][k]表示枚举到第k个数字时数字i的拆分方案数. 则有状态转移方程: dp[i][k] = dp[i][k - 1] + dp[i - num[k]][k]; 熟悉完全背包的朋友可以看出,这个方程和完全背包的状态转移方程如出一辙,第二维可以省去,只要将i从小到大枚举即可. 1 #include <iostream> 2 #include <cs

整数拆分

将一个整数N拆分成n个连续自然数的和.例如: 15 = 1+2+3+4+5 15 = 4+5+6 15 = 7+8 实现一个函数,打印所有可能,并且统计有多少种方法? 分析过程如下. 对于一个数N, 2个自然数相加:m+(m+1)                                                                                                                  =2m+1 3个自然数相加:(m-1)+m

Pollard-Rho大整数拆分模板

随机拆分,简直机智. 关于过程可以看http://wenku.baidu.com/link?url=JPlP8watmyGVDdjgiLpcytC0lazh4Leg3s53WIx1_Pp_Y6DJTC8QkZZqmiDIxvgFePUzFJ1KF1G5xVVAoUZpxdw9GN-S46eVeiJ6Q-zXdei 看完后,觉得随机生成数然后和n计算gcd,可以将随机的次数根号一下.思想很叼. 对于里面说的birthday trick,在执行次数上我怎么看都只能减一半.只是把平均分布,变成了靠近0

LightOJ 1336 Sigma Function(数论 整数拆分推论)

--->题意:给一个函数的定义,F(n)代表n的所有约数之和,并且给出了整数拆分公式以及F(n)的计算方法,对于一个给出的N让我们求1 - N之间有多少个数满足F(x)为偶数的情况,输出这个数. --->分析:来考虑F(x)为奇数的情况,给据题目中给我们的公式,,如果F(x)为奇数,那么这个多项式里面的任何一项都必须是奇数,可以知道p = 2时,        p^e - 1肯定是奇数,如果p != 2,当且仅当e为偶数的时候,此项为奇数,证明如下: 原式变形为[ p^(e+1) -p + (