hoj 1246题 http://acm.hdu.edu.cn/showproblem.php?pid=1246
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 327 Accepted Submission(s): 185
如上图所示,图中的虚线称为Ferrers图的虚轴。若将图一绕虚轴旋转180°,即将第一行与第一列对调,将第二行与第二列对调,……,这样所得到的图仍为Ferrers图,如下图所示。
这两个图称为一对共轭Ferrers图。有一些Ferrers图,沿虚轴转换后的Ferrers图仍为它本身,也就是说这个Ferrers图关于虚轴对称,那么这个Ferrers图称为自共轭Ferrers图。下图便是一个自共轭Ferrers图。
现在我们的目标是寻找的是大小为n的自共轭Ferrers图的总数。所谓大小为n的自共轭Ferrers图是指由n个方格组成的自共轭Ferrers图。
1 2 3
1 0 1
题意:完全理解后做起来就不难了,比赛中我竟然做都没做,因为实在找不到规律。可能是头晕吧,
重要特点:“上层格子数不少于下层格子数”。 关键思路:对于一个自共轭Ferrers图 ,去掉
第一行和第一列,剩下的部分(从第二行第二列算起)仍然是一个自共轭Ferrers图
输入:n表示箱子个数
输出:可以摆出多少自共轭Ferrers图
第一行箱子和第一列箱子是一样的 假设第一行有i个箱子,那么除去第一列第一行后,还有箱子:n-(2*i-1)。
f[n][i]表示总共有n个格子,且第一层格子数不多于i的自共轭Ferrers图的数量
得到递推式: f[n][i]=f[n][i-1]+f[n-2*i+1][i-1] 剩下的就不难了
#include "iostream" #include "cmath" #include "stdio.h" #include "string.h" #include "stdlib.h" using namespace std; const int MAXN=320; int fer[MAXN][MAXN]={0}; void init() { fill_n(fer[0],MAXN,1); for(int n=1;n<MAXN;n++) for(int i=1;i<MAXN;i++) //fer[n][i]表示共有n个箱子,第一行的箱子数 { //小于等于i的情况有多少种 fer[n][i]=fer[n][i-1]; if(2*i-1<=n) fer[n][i]+=fer[n-2*i+1][i-1]; } } int main() { init(); int n; while(scanf("%d",&n)==1) printf("%d\n",fer[n][n]); return 0; }