uva10453
2016-03-01 21:55
351 查看
题目大意:
可以增加字符,求使已给字符串变成回文需要添加的最少字符
思路:
DFS + DP
当两个字母相等的时候,可以选择dp[m]
= dp[m + 1][n - 1]。
也可以选择dp[m]
= min(dp[m + 1]
,dp[m][n -1]) + 1;
选择这两种中比较小的一个。
而如果两个字母不相等的时候只有一种选择。
dp[m]
=min(dp[m + 1]
,dp[m][n - 1]) + 1;
代码:
可以增加字符,求使已给字符串变成回文需要添加的最少字符
思路:
DFS + DP
当两个字母相等的时候,可以选择dp[m]
= dp[m + 1][n - 1]。
也可以选择dp[m]
= min(dp[m + 1]
,dp[m][n -1]) + 1;
选择这两种中比较小的一个。
而如果两个字母不相等的时候只有一种选择。
dp[m]
=min(dp[m + 1]
,dp[m][n - 1]) + 1;
代码:
#include <iostream> using namespace std; #include <stdio.h> #include <cstring> const int maxn = 1010; const int INF = 0x7ffffff; int dp[maxn][maxn];//表示i到j的最少操作的次数 char s[maxn]; int dfs(int m,int n) { if(m >= n) return 0; if(dp[m] != INF) return dp[m] ; if(s[m] == s ) dp[m] = min(dfs(m + 1,n - 1),min(dfs(m, n - 1),dfs(m + 1,n)) + 1); else dp[m] = min(dfs(m, n - 1),dfs(m + 1, n)) + 1; return dp[m] ; } void print(int m,int n) { if(m > n) return ; if(m == n) { printf("%c",s[m]); return ; } if(s[m] == s ) { printf("%c",s[m]); print(m + 1, n - 1); printf("%c",s ); } else if(dp[m] == dp[m + 1] + 1) { printf("%c",s[m]); print(m + 1,n); printf("%c",s[m]); } else { printf("%c",s ); print(m,n - 1); printf("%c",s ); } } int main() { while(scanf("%s",s) != EOF) { int len = strlen(s); for(int i = 0; i < len; i++) { for(int j = 0; j < len ; j++) dp[i][j] = INF; } printf("%d ",dfs( 0 ,len - 1)); print(0,len - 1); printf("\n"); } return 0; }
相关文章推荐
- LIS+输出路径模板(1160)
- 搭建自己的MVC框架
- 安装SQL Server 2014
- 2016年3月1号【运行出错,IndentationError: unindent does not match any outer indentation level】
- jQuery 实现导航栏 lable页
- 递归思想-汉诺塔解法
- String,StringBuffer与StringBuilder的区别??
- 3ds Max2015关于注册的细节
- Android中Snackbar的使用
- ubuntu如何安装nodejs最新版 本
- 第二十课(一)
- 对象的筛选
- bzoj 3657 斐波那契数列(fib.cpp/pas/c/in/out)
- 紫书 p59 习题3-8
- 爬虫学习:一个管用的贴吧妹子图下载器
- Codeforces 633D Fibonacci-ish(暴力)
- MongoDB的安装(Linux平台)
- 2.OC蓝牙功能
- ping命令中请求超时是什么意思?
- 大脑记忆系统研究取得重大进展:或被用于开发新的芯片和操作系统