题目描述:长度为n的字符串,只能由A,B,C组成,其中包含ABC子串 的为纯净串,不包含ABC子串的为暗黑串。求长度为n的所有串中暗黑串个个数。
例如:n=2时,暗黑串有AA,BB,CC,AB,AC,BA,BC,CA,CB一共9个暗黑串
题目分析:
暗黑串无非就两种形式:以两个相同的字符结尾,以两个不同的字符结尾
f[i][0]:表示长度为i的字符串中以XX形式结尾的暗黑串的个数
f[i][1]:表示长度为i的字符串中以XY形式结尾的暗黑串的个数
如何根据f[i-1][0],f[i-1][1]来求f[i][0]和f[i][1]呢?
以XX结尾的串+X仍然是以XX结尾的字符串,以XY结尾的字符串+Y变成了以YY结尾的串
以XX结尾的串+(A,B,C)中的非X就变成了以XY结尾的串(A\B\C中有两个符合要求),
以XY结尾的串+(A,B,C)中非且Y非(ABC-XY)的字符就仍然还是以XY结尾(A\B\C中只有一个符合要求)
经过以上分析可知:f[i][0]=f[i-1][0]+f[]i-1][1];f[i][1]=2*f[i-1][0]+f[i-1][1];
import java.util.Scanner;
public class T2 {
public static void main(String[] args)
{
Scanner in=new Scanner(System.in);
while(in.hasNext())
{
int n=in.nextInt();
System.out.println(solve(n));
}
}
static long solve(int n)
{
if(n==1)
return 3;
long[][] f=new long[32][2];
f[2][0]=3;
f[2][1]=6;
for(int i=3;i<=n;i++)
{
f[i][0]=f[i-1][0]+f[i-1][1];
f[i][1]=2*f[i-1][0]+f[i-1][1];
}
return f[n][0]+f[n][1];
}
}