合法字符串 【动态规划】

字符串只有可能有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)

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-26 23:14:31

合法字符串 【动态规划】的相关文章

用户输入一个字符串,如果以a结尾,则认为是合法字符串,否则为非法字符串,提示用户重新输入

import java.util.Scanner; /** * */ /** * Homework14 * * @Description:用户输入一个字符串,如果以a结尾,则认为是合法字符串,否则为非法字符串,提示用户重新输入. Test04 * * @author * * email: [email protected] 2017年4月21日上午12:27:02 * */public class Test04 { public static void main(String[] args) {

nyist oj 37 回文字符串 (动态规划经典)

回文字符串 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba".当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串.现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串. 输入 第一行给出整数N(0<N<100) 接下来的N行,每行一个字符串,每个字符串长度不超过1000. 输出 每行输出所需添加的最少字符

交错字符串——动态规划

题目描述: 给定三个字符串A, B, C,判断C是否由A和B交错构成.交错构成的意思是,对于字符串C,可以将其每个字符标记为A类或B类,使得我A类的每个字符顺序构成了A字符串,B类的每个字符顺序构成了B字符串.如:对于A="rabbit" B="mq", "rabmbitq"是由A和B交错构成的,但"rabbqbitm"不是由A和B交错构成. 解题思路: 1.直接顺序比较,从C中依次拿掉A,看剩下的是不是等于B,若是则返回tr

(字符串动态规划)一个字符串变成另一个字符串的步骤数

题目: 给定两个字word1和word2,找到将word1转换为word2所需的最小步骤数. (每个操作计为1步). 您对单词允许以下3种操作: a)插入字符 b)删除字符 c)替换字符 思路: dp[i][j]指把word1[0..i - 1]转换为word2[0..j - 1] 的最小操作数. 边界条件: dp[i][0] = i; 从长度为 i 的字符串转为空串 要删除 i 次 dp[0][j] = j. 从空串转为长度为 j 的字符串 要添加 j 次 一般情况: 如果word[i - 1

招银2018[编程题]寻找合法字符串

给出一个正整数n,请给出所有的包含n个'('和n个')'的字符串,使得'('和')'可以完全匹配. 例如: '(())()','()()()' 都是合法的: '())()('是不合法的. #include <stdio.h> #include <iostream> using namespace std; #define MAX 50 bool start = true; //pos: 此时的位置下标 //NumPre: 剩余的左括号数目 //NumPost: 剩余的右括号数目 v

Luogu2543[AHOI2004]奇怪的字符串 (动态规划 LCS)

04年的省选这么water吗,开个滚动数组算了 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #define R(a,b,c) for(register int a = (b); a <= (c); ++ a) #define nR(a,b,c) for(register int a = (b);

动态规划--合法括号字段

题目来源:51node 1791 题意:找出合法子字符串的个数,先找出每个'('对应的')'位置,从后往前扫求和. 代码: /***************************************************** *Author:chenxi *method: s[i]如果是'(',那么pos[i]代表的是与之匹配到的')'位置 *dp[pos[i]]代表的是合法字符串的数目,从n到i的合法字符串个数 *dp[i] = dp[pos[i]+1]+1 * ***********

51nod 1196 字符串的数量

用N个不同的字符(编号1 - N),组成一个字符串,有如下要求: (1) 对于编号为i的字符,如果2 * i > n,则该字符可以作为结尾字符.如果不作为结尾字符而是中间的字符,则该字符后面可以接任意字符. (2) 对于编号为i的字符,如果2 * i <= n,则该字符不可以作为结尾字符.作为中间字符,那么后面接的字符编号一定要 >= 2 * i. 问有多少长度为M且符合条件的字符串,由于数据很大,只需要输出该数Mod 10^9 + 7的结果. 例如:N = 2,M = 3.则abb,

Unbuntu修改主机名

Linux主机名是在安装Linux操作系统的过程中设定的,并作为网络中的某一台主机的唯一标志,但是在安装好Linux系统后,如果想修改主机名,该怎么办呢?本文介绍Ubuntu12.10下修改主机名 1.快速查看主机名 在Ubuntu系统中,快速查看主机名的方法:是在终端窗口中输入命令:hostname或uname–n,均可以查看到当前主机名. 2.临时修改主机名 修改主机名最为快速的方法就是使用命令“hostname新主机名”来改变当前主机名,其中“新主机名”可以用任何合法字符串来表示.不过采用