动态规划。
解释一下cal中数组c的意义:
c[i][0]表示铺满长度为i的地板的所有方法使用长度为1的瓷砖的数量;
c[i][1]表示铺满长度为i的地板且最后一块瓷砖长度为1的方法数;
c[i][2]表示铺满长度为i的地板且最后一块瓷砖长度为2的方法数;
c[i][3]表示铺满长度为i的地板且最后一块瓷砖长度为3的方法数;
cal函数通过返回值返回总的方法数,通过c1返回长度为1的瓷砖使用数量。
这是个基本算法示例。还可以优化。
程序代码:
#include <stdio.h>
#define MAX_N 42
int cal(int n, int * c1)
{
int c[MAX_N + 1][4] = {{1}, {1, 1}, {0, 0, 1}, {2, 1, 1, 1}};
int i;
for(i = 4; i <= n; i++)
{
c[i][0] = c[i - 2][0] + c[i - 3][0] +
c[i - 3][0] + c[i - 3][1] + c[i - 3][2] + c[i - 3][3] +
c[i - 4][0] + c[i - 4][1] + c[i - 4][2] + c[i - 4][3];
c[i][1] = c[i - 1][2] + c[i - 1][3];
c[i][2] = c[i - 2][1] + c[i - 2][2] + c[i - 2][3];
c[i][3] = c[i - 3][1] + c[i - 3][2] + c[i - 3][3];
}
*c1 = c[n][0];
return c[n][1] + c[n][2] + c[n][3];
}
int main()
{
int n, c, c1;
scanf("%d", &n);
c = cal(n, &c1);
printf("%d %d\n", c, c1);
return 0;
}