1)   题目

Palindrome

Time Limit: 3000MS

Memory Limit: 65536K

Total Submissions: 46005

Accepted: 15688

Description

A palindrome is a symmetrical string, that is, a string read identically from left to right as well as from right to left. You are to write a program which, given a string, determines the minimal number of characters to be inserted into the string in order to obtain a palindrome.

As an example, by inserting 2 characters, the string "Ab3bd" can be transformed into a palindrome ("dAb3bAd" or "Adb3bdA"). However, inserting fewer than 2 characters does not produce a palindrome.

Input

Your program is to read from standard input. The first line contains one integer: the length of the input string N, 3 <= N <= 5000. The second line contains one string with length N. The string is formed from uppercase letters from 'A' to 'Z', lowercase letters from 'a' to 'z' and digits from '0' to '9'. Uppercase and lowercase letters are to be considered distinct.

Output

Your program is to write to standard output. The first line contains one integer, which is the desired minimal number.

Sample Input

5

Ab3bd

Sample Output

2

2)    题意

题目给出回文的定义:一串字符,从左往右读和从右往左读是完全一样的。比如aba,从左往右读和从右往左读都是aba。

给出一串字符,求使该字符串是回文需要添加的最少字符个数。

3)    数据范围

字符串的长度n,3<=n<=5000。

4)    算法

动态规划法。设字符串为S,长度为L,d[i][j]表示以第i个字符为首,第j个字符为尾的字符串构成回文最少需要添加的字符个数,i和j的初值分别为1、L。

如果S[i] == S[j],即字符串两端的字符相等,d[i][j] = d[i+1][j-1],

即d[i][j]等于去掉头尾后的字符串的d值。

如果S[i] != S[j],此时划分出两个子问题,求d[i][j-1]和d[i+1][j],它两中较小的值再加1即为d[i][j](加上的1个字符是用于和S[i]或者S[j]构成对称的)。

状态转移方程:

从上面的分析可以看出,这个问题的实质是求最长公共子序列,只是这两个序列分别是串S的前一部分和串S后一部分的逆序列。

5)    代码

[cpp] view plaincopyprint?
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5. #define MIN(a, b) ((a) < (b) ? (a) : (b))
  6. #define MAXSIZE 5005
  7. //开始没有考虑内存问题,使用了int型,超内存限制,也可使用滚动数组解决
  8. unsigned short d[MAXSIZE][MAXSIZE];
  9. int ToPalindrome(char *s, int n)
  10. {
  11. int i, j, k;
  12. //只有一个字符时,不需要添加字符
  13. for (i = 0; i < n; i++)
  14. {
  15. d[i][i] = 0;
  16. }
  17. //串长度为2时
  18. for (i = 1; i < n; i++)
  19. {
  20. if (s[i-1] == s[i])
  21. {
  22. d[i-1][i] = 0;
  23. }
  24. else
  25. {
  26. d[i-1][i] = 1;
  27. }
  28. }
  29. //串长度递增
  30. for (k = 2; k < n; k++)
  31. {
  32. for (i = 0, j = k; j < n; i++, j++)
  33. {
  34. if (s[i] == s[j])
  35. {
  36. d[i][j] = d[i+1][j-1];
  37. }
  38. else
  39. {
  40. d[i][j] = MIN(d[i][j-1], d[i+1][j]) + 1;
  41. }
  42. }
  43. }
  44. return d[0][n-1];
  45. }
  46. int main(void)
  47. {
  48. char str[MAXSIZE];
  49. int n;
  50. while (scanf("%d", &n) != EOF)
  51. {
  52. getchar();
  53. gets(str);
  54. printf("%d\n", ToPalindrome(str, n));
  55. }
  56. return 0;
  57. }

6)    测试数据

5

Ab3bd

3

aaa

7

Aabcdba

7)    提交结果

动态规划——Poj 1159 Palindrome相关推荐

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

    POJ 1159 Palindrome(字符串变回文:LCS) http://poj.org/problem? id=1159 题意: 给你一个字符串, 问你做少须要在该字符串中插入几个字符能是的它变 ...

  2. POJ 1159 - Palindrome 优化空间LCS

    将原串和其逆序串的最长公共子序列求出来为M..那么2*n-M就是所需要加的最少字符..因为求出的M就是指的原串中"潜伏"的最长回文.. 问题转化为求LCS..但是n最大到5000. ...

  3. POJ 1159 (DP)

    题目:http://poj.org/problem?id=1159 思路: 找出原串的最长回文子串,当然这里说的回文子串可以不连续.用原串的长度减去最长回文子串的长度即可得出结果. 设原串a[5001 ...

  4. POJ - 3974 Palindrome(二分+哈希/马拉车)

    题目链接:点击查看 题目大意:给出一个字符串,求字符串中最长的回文子串,这个字串可以包含主串本身 题目分析:这个题就是之前徐州网络赛的那个回文题目的弱化版..那个题目正解是要用回文自动机,但我不会,当 ...

  5. 动态规划 POJ 1088 滑雪

    Description Michael 喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知 ...

  6. 1159 Palindrome

    Palindrome Time Limit: 3000ms Memory limit: 65536kB 题目描述 A palindrome is a symmetrical string, that ...

  7. POJ 3974 Palindrome (算竞进阶习题)

    hash + 二分答案 数据范围肯定不能暴力,所以考虑哈希. 把前缀和后缀都哈希过之后,扫描一边字符串,对每个字符串二分枚举回文串长度,注意要分奇数和偶数 #include <iostream& ...

  8. 滚动数组~\(≧▽≦)/~

    今天第一次用了滚动数组,缘由要从一道题说起:POJ 1159 Palindrome 题意:给你一个字符串,求对字符串最少添加几个字符可变为回文串. 分析: 简单做法是直接对它和它的逆序串求最长公共子序 ...

  9. POJ 动态规划题目列表

    1.这份列表当然不是我原创的,从文库里下载了一份,放到这里便于自己浏览和查找题目. ※最近更新:Poj斜率优化题目 1180,2018,3709 列表一:经典题目题号: 容易:  1018, 1050 ...

最新文章

  1. 【按住你的心】——Android开发CheckBoxRadioButton控件的简单使用
  2. 基于JWT的Token认证机制实现
  3. 每日一题(24)—— const
  4. 自定义注解 相关知识汇总(转)
  5. $_SERVER[HTTP_HOST]
  6. 武汉理工大学合肥工业大学 计算机,合工大为什么从985降到211?附合肥工业大学211地位(合工大不是985)...
  7. win7更新_WIN7操作系统无法更新IE11的解决办法
  8. Linux远程拷贝文件命令 - scp
  9. 测试用例设计方法_正交实验法(游戏向)
  10. java、Dom4j、循环迭代递归解析XML,不论是否是叶子节点、有复合结构
  11. 使用regedit导入导出环境变量
  12. 十个数字内的最小绝对值
  13. 时代》杂志评出的100部最佳英语小说(含下载)
  14. KMeans算法的Mapreduce实现
  15. 基于主从博弈的智能小区电动汽车充电管理及代理商定价策略
  16. 实训周实验(eNSP安装+简单使用+实验项目)总结
  17. AR可视化远程协助,医护诊疗,对讲指挥调度系统方案
  18. python 调用ocx
  19. 对极几何-三角测量-知识点
  20. @Transaction

热门文章

  1. 【Android 异步操作】Android 线程切换 ( 判定当前线程是否是主线程 | 子线程中执行主线程方法 | 主线程中执行子线程方法 )
  2. 【错误记录】SeeMusic 一直卡在主界面无法使用 ( 删除 C:\Users\用户名称\AppData\LocalLow\Visual Music Design 应用信息 )
  3. 【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词
  4. [Spring cloud 一步步实现广告系统] 14. 全量索引代码实现
  5. intellijidea课程 intellijidea神器使用技巧 3-1 列操作
  6. JavaScript之图片的无缝滚动
  7. SharePoint 2013 Word 转换PDF服务介绍及示例
  8. Word2003文档打不开怎么办?1分钟帮你解决!
  9. 硬盘分区表知识——详解硬盘MBR(转)
  10. JavaScript文本框的操作