自共轭Ferrers图

 

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


Problem Description
Ferrers图是一个自上而下的n层格子,且上层格子数不少于下层格子数。

如上图所示,图中的虚线称为Ferrers图的虚轴。若将图一绕虚轴旋转180°,即将第一行与第一列对调,将第二行与第二列对调,……,这样所得到的图仍为Ferrers图,如下图所示。

这两个图称为一对共轭Ferrers图。有一些Ferrers图,沿虚轴转换后的Ferrers图仍为它本身,也就是说这个Ferrers图关于虚轴对称,那么这个Ferrers图称为自共轭Ferrers图。下图便是一个自共轭Ferrers图。

现在我们的目标是寻找的是大小为n的自共轭Ferrers图的总数。所谓大小为n的自共轭Ferrers图是指由n个方格组成的自共轭Ferrers图。

Input
输入数据有多行,每行为一个正整数n(1<=n<=300)。表示自共轭Ferrers图的大小为n。

Output
对应输入的每一个n,输出一行大小为n的自共轭Ferrers图的总数。

Sample Input
  
  
1 2 3

Sample Output
  
  

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; }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值