网易0912 暗黑字符串
题目的大意:
一个字符串只能由‘A’、‘B’、‘C’三个字母组合而成;若在字符串中如果‘A’‘B’‘C’三个字符任意组合出现,则此字符串为清澈的,否则为黑暗的。如“AABBCCABAA”因为包含“CAB”,所以是清澈的;“AABBCCBCBBA”则是黑暗的。
输入:字符串的长度n(1 <= n <= 30)
输出:包含的黑暗字符串的个数
样例:
输入:2
3
输出:9
21
解题思路:
字符串不为黑暗,n >= 3;
当 n = 1时,有3种情况,均为黑暗;
当 n = 2时,有9种情况,均为黑暗;
当 n = 3时,第一个位置有3种选择,第二个位置也有3种选择;第三个位置看前两个位置的选择情况:如果前两个字符相同则第三个位置有三种选择;否则有两种选择。故共有3 * (3 + 2 * 2) = 21种是黑暗的。
当n = 4时,按照n = 3的情况进行类推,如果第2个位置和第三个位置字符相同时,第四个位置有3种选择,否则有两种选择。故共有 3 * (3 * (1 + 2) + 2 * (1 * 2 + 2))) = 51种是黑暗的
......
规律:
从 n = 3开始共有 3 * (3 * num3 + 2 * num2)种
并且 num3' = num3 + num2 num2' = 2 * num3 + num2
源码如下:
package wangyi;
import java.util.Scanner;
public class Main2 {
public static void main(String[] args) {
@SuppressWarnings("resource")
Scanner scan = new Scanner(System.in);
long arr[] = new long [30];
arr[0] = 3;
arr[1] = 9;
long num3 = 1;
long num2 =2;
for(int i = 2;i < 30;i++){
arr[i] = 3 * (3 * num3 + 2 * num2);
long temp = num3;
num3 = num2 + num3;
num2 = 2 * temp + num2;
}
int n;
while(scan.hasNextInt()){
n = scan.nextInt();
System.out.println(arr[n - 1]);
}
}
}