HDOJ多校联合第四场
2014-08-09 21:37
183 查看
B题:
C题:仅由'A','G','C','T',4个字母组成,给定一个字符串S,|S|<=15,给定一个整数m,以m为长度且仅含4种字母的字符串T,求LCS(S,T)为0,1,2,3....|S|,时相应字符串T的数目。
分析:dp+状态压缩
反正我不会这题,也是看了羊神的代码之后才明白这题的思路
下面说说我的理解吧:
由于|S|长度最大为15,所以用一个二进制编码表示是哪些位置上的字母构成LCS,并求相应的数目。
dp[0][st],dp[1][st]记录的是相应字母构成LCS时,T可能的数目,然后一个一个去给T添加字母直到T长度为m。注意先要将某种状态st添加某个字母后变化成另一种状态的转移处理出来。
now[i]表示S中前i个字母和T的LCS长度,添加一个字母后用数组next[i]记录,表示S前i个字母和添加一个字母的T的LCS长度。
预处理时转移方程就是:
next[i] = now[i-1]+1(s[i-1] == da[k])
next[i] = max(next[i-1], now[i]) (s[i-1] != da[k])
这个转移和一般求两个字符串LCS是相同的。
然后就是根据处理出来的转移,一个一个添加字母并且记录数目:
dp[0][st] 添加字母c到达状态st',则此时可能的字符串数目dp[1][st']需要加上前面未添加字母时那部分的数目:
dp[1]st'] += dp[0][st];
代码:
View Code
C题:仅由'A','G','C','T',4个字母组成,给定一个字符串S,|S|<=15,给定一个整数m,以m为长度且仅含4种字母的字符串T,求LCS(S,T)为0,1,2,3....|S|,时相应字符串T的数目。
分析:dp+状态压缩
反正我不会这题,也是看了羊神的代码之后才明白这题的思路
下面说说我的理解吧:
由于|S|长度最大为15,所以用一个二进制编码表示是哪些位置上的字母构成LCS,并求相应的数目。
dp[0][st],dp[1][st]记录的是相应字母构成LCS时,T可能的数目,然后一个一个去给T添加字母直到T长度为m。注意先要将某种状态st添加某个字母后变化成另一种状态的转移处理出来。
now[i]表示S中前i个字母和T的LCS长度,添加一个字母后用数组next[i]记录,表示S前i个字母和添加一个字母的T的LCS长度。
预处理时转移方程就是:
next[i] = now[i-1]+1(s[i-1] == da[k])
next[i] = max(next[i-1], now[i]) (s[i-1] != da[k])
这个转移和一般求两个字符串LCS是相同的。
然后就是根据处理出来的转移,一个一个添加字母并且记录数目:
dp[0][st] 添加字母c到达状态st',则此时可能的字符串数目dp[1][st']需要加上前面未添加字母时那部分的数目:
dp[1]st'] += dp[0][st];
代码:
View Code
相关文章推荐
- hdu5334 Virtual Participation 多校联合第四场
- HDOJ 4632 - Palindrome subsequence/2013多校联合第四场A 区间DP
- hdu 4632 Palindrome subsequence 区间dp 多校联合训练第四场
- [模拟] 多校联合第四场 HDU5327 Olympad
- HDU/HDOJ 3875 Euclidean Algorithm 多校联合第四场
- hdu 4642 fliping game 多校联合训练第四场
- [枚举] 多校联合第四场 hdu328 problem killer
- HDU 6069 Counting Divisors 多校联合第四场
- HDU 多校联合第四场
- 2015多校联合第四场hdu5327Olympiad 递推
- hdu 4902 Nice boat 2014年多校联合第四场
- hdu 4639 hehe 多校联合训练第四场
- HDOJ多校联合第五场
- 2015年多校联合训练第四场(Olympiad)hdu5327
- 2016多校联合第四场 HDU5768
- 2017多校联合第四场1011/hdu6181(次短路)
- 2013年多校联合第四场(2013 Multi-University Training Contest 4)解题报告
- 2015年多校联合训练第四场(Problem Killer)hdu5328
- 2016多校联合训练赛 第四场1001 Another Meaning hdu 5763
- hdu5336 多校联合第四场1010 模拟+bfs优先队列