题目链接: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); }