UVa 10739 - String to Palindrome
2015-06-23 14:16
357 查看
题目:给你一个字符串,可以进行增删改三种操作,问变成回文串最少的操作次数。
分析:动态规划,dp,LCS。可以利用区间dp求解,这里利用LCS求解更快。
利用字符串和自己的翻转求最大公共子序列,然后枚举所有的dp[i][len-i],
找最小的即可。注意可能最小值在dp[i-1][len-i],即str[i]为中间元素,不用匹配。
说明:注意dp的初始化赋值。
分析:动态规划,dp,LCS。可以利用区间dp求解,这里利用LCS求解更快。
利用字符串和自己的翻转求最大公共子序列,然后枚举所有的dp[i][len-i],
找最小的即可。注意可能最小值在dp[i-1][len-i],即str[i]为中间元素,不用匹配。
说明:注意dp的初始化赋值。
#include <cstring> #include <cstdio> int dp[1001][1001]; int main() { int n; char str1[1001],str2[1001]; while (~scanf("%d",&n)) for (int t = 1; t <= n; ++ t) { scanf("%s",str1); int len = strlen(str1); for (int i = 1; i <= len; ++ i) str2[i-1] = str1[len-i]; //初始条件 for (int i = 0; i <= len; ++ i) dp[i][0] = dp[0][i] = i; for (int i = 1; i <= len; ++ i) for (int j = 1; j <= len; ++ j) { if (str1[i-1] == str2[j-1]) dp[i][j] = dp[i-1][j-1]; else dp[i][j] = dp[i-1][j-1]+1; if (dp[i][j] > dp[i][j-1]+1) dp[i][j] = dp[i][j-1]+1; if (dp[i][j] > dp[i-1][j]+1) dp[i][j] = dp[i-1][j]+1; } int min = len; for (int i = 1; i < len; ++ i) { if (min > dp[i-1][len-i]) min = dp[i-1][len-i]; if (min > dp[i][len-i]) min = dp[i][len-i]; } printf("Case %d: %d\n",t,min); } return 0; }
相关文章推荐
- Behavioral模式之Observer模式
- Javadoc详解(二)
- ALSA声卡驱动中的DAPM详解之七:dapm事件机制(dapm event)
- Flex4+BlazeDS+Spring+Hibernate 整合
- java 免费发送短信实例程序
- 巧克力爱好者匿名顺序图——管理员
- c#实现统计代码执行时间
- android属性动画详解2
- 派生类向基类转换的可访问性
- 【读书笔记:C++ primer plus 第六版 中文版】第8章 函数探幽
- [trouble-shooting]android 无法启动X86模式虚拟机的问题解决。
- 如果在安装32位oracle 客户端组件时的情况下以64位模式运行,将出现问题
- Eclipse的ADT插件提示版本问题的解决办法
- python多线程编程----threading模块
- TCP 连接断连问题剖析
- Android Animation学习笔记
- ALSA声卡驱动中的DAPM详解之六:精髓所在,牵一发而动全身
- 免安装版Tomcat配置用户登录项目管理界面
- 腾讯QQ音乐网页版 音频初始化模块解压混淆js源码
- php常用正则表达式