题目:
字符串只有可能有A、B、C三个字母组成,如果任何紧邻的三个字母相同,就非法。求长度为n的合法字符串有多少个?比如: ABBBCA是非法,ACCBCCA是合法的
分析: 动态规划的思路——真的要枚举么?
dp[i][0] : 长度为i的、最后两位不同的合法串的个数
dp[i][1]: 长度为 i的、最后两位相同的合法串的个数
递推: dp[i][0] = (dp[i-1][0] * 2+ dp[i-1][1] * 2)
dp[i][1] = dp[i-1][0]
初值
dp[1][0] = 3, dp[1][1] = 0
结果
dp[n][0] + dp[n][1]
空间优化
dp[i][0,1]只与dp[i-1][0,1]相关,可以省掉高维
时间复杂度
O(n)
package july37;
/**题目:合法的字符串
* 字符串只有可能有A、B、C三个字母组成,如果任何紧邻的三个字母相同,就非法。
* 求长度为n的合法字符串有多少个?比如: ABBBCA是非法,ACCBCCA是合法的
*
*dp[i][0] : 长度为i的、最后两位不同的合法串的个数
*dp[i][1]: 长度为 i的、最后两位相同的合法串的个数
*递推: dp[i][0] = (dp[i-1][0] * 2+ dp[i-1][1] * 2)
* dp[i][1] = dp[i-1][0]
*
* 初值
*dp[1][0] = 3, dp[1][1] = 0
*结果
*dp[n][0] + dp[n][1]
*空间优化
*dp[i][0,1]只与dp[i-1][0,1]相关,可以省掉高维
*时间复杂度
*O(n)
*时空间复杂度
*O(1)
* @author 牵手无奈
*
*/
public class LegalString {
public static void main(String[] args) {
// TODO Auto-generated method stub
countLegalString(13);
}
public static void countLegalString(int n){
int[][] result = new int[2][2];
result[1][0]=3;
result[1][1]=0;
int temp = 3;
for(int i=2;i<=n;i++){
result[i%2][0]=result[(i+1)%2][0]*2+result[(i+1)%2][1]*2;
result[i%2][1]=result[(i+1)%2][0];
temp = result[i%2][0]+result[i%2][1];
}
System.out.println("temp="+temp);
}
}