题目链接:http://poj.org/problem?id=1221
题目意思是输入n,并且求出和是n的按从中间到两边递减的回文数个数
用a[i][j](long long类型)存储和是n,回文中的数都大于等于j的回文个数
代码有点乱,不过时间很好
Memory: 1092K | Time: 0MS |
上代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
long long a[300][300];
long long dp(int n,int z)
{
int i;
long long sum=0;
if(n%2==0)
sum++;
for(i=z;i<=n/3;i++)
{
sum++;
if(n==i*4)
{
sum++;
}
if(n-i*4>=i)
{
if(a[n-2*i][i]==0)
sum+=dp(n-2*i,i);
else
sum+=a[n-2*i][i];
}
else
{
if((n-2*i)/2>i&&n%2==0)
sum++;
}
}
a[n][z]=sum;
return sum;
}
void chushi()
{
int i;
memset(a,0,sizeof(a));
for(i=1;i<300;i++)
{
a[i][i]=1;
if(i%2==0)
a[i][i/2]=1;
}
}
int main(int argc, char** argv) {
int n,i;
long long temp;
chushi();
while(scanf("%d",&n)&&n!=0)
{
temp=dp(n,1);
printf("%d %lld\n",n,temp+1);
}
return (EXIT_SUCCESS);
}