⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pku 1221 凸回文数.txt

📁 ACM资料大集合
💻 TXT
字号:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>
#include <vector>
#include <iterator>
using namespace std;
#define PB push_back
//PKU 1221 凸回文数

#define NMAX 1000

__int64 f[NMAX][NMAX];//f[i][j],和为i,最外边边界的数字为j时的个数

__int64 cal(int start,int end)
{
	int i,j,sum,k;
	for(i=start+1;i<=end;i++)
	{
		for(j=1;j<=i-1;j++)
		{
			sum=i-2*j;//sum表示除去边界的数,剩下的数的和
			if(sum<0) f[i][j]=0;
			else if(sum==0) f[i][j]=1;
			else
			{
				for(k=j,f[i][j]=0;k<=sum;k++)
					//递归到和为sum时,这里的k是和为sum的数的边界数
					//k要从j(原边界数)开始,因为是凸回文数
					f[i][j]+=f[sum][k];
			}
		}
		f[i][i]=1;
		for(j=1,f[i][0]=0;j<=i;j++) f[i][0]+=f[i][j];
	}
	return f[end][0];
}

int main()
{
	int ttmax=0,num;
	while(1)
	{
		scanf("%d",&num);
		if(num==0) break;
		else
		{
			if(num<=ttmax) printf("%d %I64d\n",num,f[num][0]);
			else 
			{
				printf("%d %I64d\n",num,cal(ttmax,num));
				ttmax=num;
			}
		}
	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -