uva 10918 计数问题



看了几篇博客,只有这篇博客真正的把这个问题说清楚了



这种题很大概率是要得到递推公式,但是怎么得到递推公式是个难点,首先考虑这样一个问题,我们怎么样拼出一个长度为x且无法用竖线分割的矩形(x为偶数),当x=2时,有三种拼法,很简单,那么当x>2时?可以画一下

先放成这样
这时再如果再放一个竖的,那就不满足不可竖线不可分割的要求了,所以必须放横的,而且放俩个

放了之后是这个样子滴
然后再放,最上面那个锲进去的只能放横的,所以再放上去一个横的

结果就是这个样子滴
虽然难看,但是可以发现此时与第一幅图的情况是一样的

也就是说我们要重复这一过程,直到长度达到x

那么我们拼出这样一个长度为x且竖线不可分割的矩形,有多少种情况?仔细观察一下,刚开始的如果先在下面放一个横的,再上面放一个竖的,这样其实是和刚才说的那种情况是对称的,所以也是一种,其实只有两种

说完这些,这道题的递推公式就容易得出了
首先n一定是偶数,令Fn表示长度为n的矩形的填充方法数

F2=3
考虑n>2的情况,最右边如果是一个长度为2的小矩形,那么这种情况有3*Fn-2种情况,最右边如果是长度为4的小矩形,有2*Fn-4种情况,依次递推,直到最右边是长度为n的,所以边界时2*F0,其实没有n=0这种情况,但是为了递推公式,可以令它为1,即F0=1

所以递推公式就出来了 Fn=3*Fn-2+2*(Fn-4+...F0) 
写出Fn-2的递推式之后做差可以化简得到 Fn=4*Fn-2-Fn-4

之后打表计算就行了

#include<stdio.h>
int main()
{
      long int mm[32]={0}, a, i;
      mm[0] = 1;//为了递推公式而设的;实际不会存在这种情况;
      mm[2] = 3;
      for(i = 4; i < 32; i = i+2){
             mm[i]=4*mm[i-2]-mm[i-4];//=======f(n)-f(n-2) ;
      }
      while(scanf("%ld",&a) != EOF && a != -1){
             printf("%ld\n",mm[a]);
      }
      
      return 0 ;
} 

猜你喜欢

转载自blog.csdn.net/qq_41776911/article/details/80444657