给一字符串,问最少加几个字符能够让它成为回文串。

比方 Ab3bd 最少须要两个字符能够成为回文串 dAb3bAd



思路:

动态规划 DP[i][j] 意味着从 i 到 j 这段字符变为回文串最少要几个字符,枚举子串长。

if str[i] == str[j]:

DP[i][j] = DP[i + 1][j - 1]

else:

DP[i][j] = min( DP[i + 1][j], DP[i][j - 1] ) + 1



注意:

长度较大为 5000,二维数组 5000 * 5000 须要将类型改为 short,

不需考虑 j - i < 2 的特殊情况,

由于矩阵的左下三角形会将DP[i + 1][j - 1]自己主动填零,

可是用滚动数组的时候须要考虑 j - i < 2。用滚动数组的时候,空间会变为 3 * 5000,

可这时候 DP 的含义略微变下。

DP[i][j] 意味着从第 j 个字符右移 i 个长度的字符串变为回文串所须要的最少字符数目。

3.也能够用 LCS 的方法,字符串长 - LCS( 串。逆串 ) 

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4.  
  5. int nLen;
  6. char str[5005];
  7. short DP[5005][5005];
  8.  
  9. int main(){
  10.  
  11. memset( DP, 0, sizeof( DP ) );
  12. cin >> nLen;
  13. cin >> str;
  14.  
  15. for( int len = 1; len < nLen; ++len ){
  16. for( int start = 0; start + len < nLen; ++start ){
  17. int end = start + len;
  18. if( str[start] == str[end] )
  19. DP[start][end] = DP[start + 1][end - 1];
  20. else
  21. DP[start][end] = min( DP[start + 1][end], DP[start][end - 1] ) + 1;
  22. }
  23. }
  24. cout << DP[0][nLen - 1];
  25. return 0;
  26. }

滚动数组 715K:

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4.  
  5. int nLen;
  6. char str[5005];
  7. short DP[3][5005];
  8.  
  9. int main(){
  10.  
  11. memset( DP, 0, sizeof( DP ) );
  12. cin >> nLen;
  13. cin >> str;
  14.  
  15. for( int len = 1; len < nLen; ++len ){
  16. for( int start = 0; start + len < nLen; ++start ){
  17. int end = start + len;
  18. if( str[start] == str[end] && ( end - start >= 2 ) )
  19. DP[len % 3][start] = DP[( len - 2 ) % 3][start + 1];
  20. else if( str[start] != str[end] )
  21. DP[len % 3][start] = min( DP[( len - 1 ) % 3][start + 1],
  22. DP[( len - 1 ) % 3][start] ) + 1;
  23. }
  24. }
  25. cout << DP[(nLen - 1) % 3][0];
  26. return 0;
  27. }

动态规划+滚动数组 -- POJ 1159 Palindrome的更多相关文章

  1. LCS(滚动数组) POJ 1159 Palindrome

    题目传送门 题意:一个字符串要变成回文串至少要插入多少个字符 分析:LCS,长度 - 原串和反串的最大相同长度就是要插入的个数.解释一下,当和反串相同时,在原串中已经是回文的部分了,那么减去LCS长度 ...

  2. POJ 1159 Palindrome(字符串变回文:LCS)

    POJ 1159 Palindrome(字符串变回文:LCS) id=1159">http://poj.org/problem? id=1159 题意: 给你一个字符串, 问你做少须要 ...

  3. 2021.12.10 P2516 [HAOI2010]最长公共子序列(动态规划+滚动数组)

    2021.12.10 P2516 [HAOI2010]最长公共子序列(动态规划+滚动数组) https://www.luogu.com.cn/problem/P2516 题意: 给定字符串 \(S\) ...

  4. POJ 1159 - Palindrome (LCS, 滚动数组)

    Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 55018   Accepted: 19024 Desc ...

  5. poj - 1159 - Palindrome(滚动数组dp)

    题意:一个长为N的字符串( 3 <= N <= 5000).问最少插入多少个字符使其变成回文串. 题目链接:http://poj.org/problem?id=1159 -->> ...

  6. HDU 1513 && POJ 1159 Palindrome (DP+LCS+滚动数组)

    题意:给定一个字符串,让你把它变成回文串,求添加最少的字符数. 析:动态规划是很明显的,就是没有了现思路,还是问的别人才知道,哦,原来要么写,既然是回文串, 那么最后正反都得是一样的,所以我们就正反求 ...

  7. POJ 1159 Palindrome(区间DP/最长公共子序列+滚动数组)

    Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 56150   Accepted: 19398 Desc ...

  8. POJ_1159 Palindrome (线性动态规划+滚动数组)

    题意是说,给定一个字符串,问至少还需要插入多少个字符才能使得该字符串成为回文字符串. 这道题一开始做的时候用了一个简单的动态规划,开了一个5000*5000的数组,用递归形式实现,代码如下: 其中d[ ...

  9. POJ 1159 Palindrome(LCS)

    题目链接:http://poj.org/problem?id=1159 题目大意:给定一串字符,添加最少的字符,使之成为回文串. Sample Input 5 Ab3bd Sample Output ...

随机推荐

  1. (转帖) 如何將值delay n個clock? (SOC) (Verilog)

    来源:http://www.cnblogs.com/oomusou/archive/2009/06/15/verilog_dly_n_clk.html /* (C) OOMusou 2009 http ...

  2. jquery学习 (3)文本框获取焦点之后变换样式

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. python模块之json序列化

    31.序列化:      1.json实现序列化,json.dumps()和json.loads().           >>> s1 = {'k1':'v1','k2':'v2' ...

  4. elasticsearch常用的插件

    deb 安装/usr/share/elasticsearch/   https://github.com/hangxin1940/elasticsearch-cn-out-of-box 包可以参考   ...

  5. Autoit 获取运行目录

    #include <File.au3> #include <MsgBoxConstants.au3> MsgBox($MB_SYSTEMMODAL, "", ...

  6. javaWeb遍历获取session中的值

    //方法一:通过遍历的方法进行遍历 String FileName=""; HttpSession session=request.getSession();//获取session ...

  7. JS之路——浏览器window对象

    window对象的方法 window.alert(msg) window.close() window.print() var a = window.setIntval(function,毫秒) // ...

  8. 关于 mod_python

    首先声明 本文 翻译 别人的文章,文章的作者是 mod_python 项目的负责人,目前 mod_python已由 Apache维护.原文地址: http://www.onlamp.com/pub/a ...

  9. 温故而知新 C++ 类型转换

    C语言类型转换 在C语言里用到的类型转换方式,一般都是用强制类型转换,语法:(类型说明符)(表达式),例如: (float)a 把a转换为实型,(int)(x+y) 把x+y的结果转换为整型.C语言这 ...

  10. Java中RMI框架

    嘎嘎,有空写……先记着了