Notas de pincel (ocho) -tapa rectangular
Descripción del título
Podemos usar 2 * 1 rectángulos pequeños para cubrir rectángulos más grandes horizontal o verticalmente. ¿Cuántos métodos hay para cubrir un rectángulo grande de 2 * n con n rectángulos pequeños de 2 * 1 sin superponerse?
Por ejemplo, cuando n = 3, 2 * 3 bloques rectangulares tienen 3 tipos de métodos de cobertura:
Ideas:
Hay 1 especie cuando n = 1, 2 especies cuando n = 2 y 3 especies cuando n = 3. Considere n = 4, se puede dividir en 2,2; 1,3; 3,1 tiene 7 tipos
La primera idea es dividir: cuando n = 5, se divide en 1,4; 4,1; 2,3; 3,2; y 1,4 y 4,1 tienen el mismo número de tipos, encuentre un tipo * 2 Eso es todo Más tarde se descubrió que cuando 4 se dividía en 4 rectángulos pequeños que eran verticales, esta situación se repetía. Entonces dibujé algunas más y descubrí que había demasiadas repeticiones. Este tipo de pensamiento era casi imposible.
Cambie la forma de pensar: el último rectángulo pequeño que desea colocar hacia atrás tiene dos situaciones: una se coloca verticalmente y la otra horizontalmente. Debe haber un pequeño rectángulo acostado horizontalmente debajo.
Por lo tanto, hay f (n-1) yf (n-2) en estas dos situaciones, y se siente muy familiar. ¡Es Fibonacci!
class Solution {
public:
int rectCover(int number) {
if(number==0)
return 0;
else if(number==1)
return 1;
else if(number==2)
return 2;
else
{
number--;
int a[2]={1,2};
while(number-1!=0)
{
int temp=a[1];
a[1]=a[0]+a[1];
a[0]=temp;
number--;
}
return a[1];
}
}
};