Problem Description
有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法.
Input
输入数据包含多个测试实例,每个测试实例占一行,由一个整数N组成,(0<n<=50)。
Output
对于每个测试实例,请输出全部的满足要求的涂法,每个实例的输出占一行。
Sample Input
1
2
Sample Output
3 6
思路:
有k种颜色染n个块 f[n]=(k-2)*f[n-1]+(k-1)*f[n-2]; 当前方案数有前一状态的两种可能推过来(1和n-1块的颜色是否一致)。 当然上述式子在n>=4是才能用。 f[1]=k; f[2]=k*(k-1); f[3]=k*(k-1)*(k-2); 如果n很大的会话,可以利用矩阵乘法快速幂进行加速。 可以参考Matrix67的博客
AC代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
final int N = 50;
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int input = sc.nextInt();
long[] arr = new long[N];
arr[0] = 3;
arr[1] = 6;
arr[2] = 6;
arr[3] = 18;
for (int i = 4; i < N; i++) {
arr[i] = arr[i-1] + 2*arr[i-2];
}
System.out.println(arr[input-1]);
}
}
}