Ignatius and the Princess III
- 题目大意
给你一个数n,让你求他的所有分解式有多少个,i+j和j+i视为相同的等式。
- 题解
就是个分解问题,设f(i,j)为数i不大于j的分解方法数,这样我们要求的就是f(n,n)。很容易通过定义写出f的递推式:
f(i,j)=sum( f(i-k,k) ) 1<=k<=j ;
除了f(0,0)=1,i < j时其实就是i=j的情况。
注意推的时候用d[i][j]保留f[i][j]时的解,不知道会不会超时,记录下来肯定没有坏处….
- 代码
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int d[125][125],n;
int f(int i,int j)
{
int sum=0;
if (i<j) return f(i,i);
if (d[i][j]) return d[i][j];
for (int k=j;k>=1;k--) sum+=f(i-k,k);
return d[i][j]=sum;
}
int main()
{
d[0][0]=1;
while (scanf("%d",&n)!=EOF)
{
printf("%d\n",f(n,n));
}
return 0;
}