uva10453
来源:互联网 发布:java springmvc 分页 编辑:程序博客网 时间:2024/06/05 11:11
题目大意:
可以增加字符,求使已给字符串变成回文需要添加的最少字符
思路:
DFS + DP
当两个字母相等的时候,可以选择dp[m][n] = dp[m + 1][n - 1]。
也可以选择dp[m][n] = min(dp[m + 1][n],dp[m][n -1]) + 1;
选择这两种中比较小的一个。
而如果两个字母不相等的时候只有一种选择。
dp[m][n] =min(dp[m + 1][n],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][n] != INF) return dp[m][n]; if(s[m] == s[n]) dp[m][n] = min(dfs(m + 1,n - 1),min(dfs(m, n - 1),dfs(m + 1,n)) + 1); else dp[m][n] = min(dfs(m, n - 1),dfs(m + 1, n)) + 1; return dp[m][n];}void print(int m,int n) { if(m > n) return ; if(m == n) { printf("%c",s[m]); return ; } if(s[m] == s[n]) { printf("%c",s[m]); print(m + 1, n - 1); printf("%c",s[n]); } else if(dp[m][n] == dp[m + 1][n] + 1) { printf("%c",s[m]); print(m + 1,n); printf("%c",s[m]); } else { printf("%c",s[n]); print(m,n - 1); printf("%c",s[n]); }}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;}
0 0
- uva10453
- UVA10453- Make Palindrome
- uva10453(DP 回文)
- uva10453(回文串dp)
- uva10453 - Make Palindrome(简单动归)
- 记忆话搜索dp(uva10453)
- uva10453 - Make Palindrome(递推+ 路径输出)
- NYOJ+贪心+从大到小减,是有贪心根据的额
- LIS+输出路径模板(1160)
- android学习笔记之-xml pull解析
- Light OJ 1188 Fast Queries(离线树状数组||莫队算法)
- nodejsPath
- uva10453
- Delete Last Element
- 搭建自己的MVC框架
- 杨鑫的C++上机报告
- [GDKOI2016]魔卡少女
- win8.1系统中Sybase PowerBuilder已停止工作的有效解决办法
- mysql 常见错误:Can't create table... errno150原因分析
- PAT-A1009 Product of Polynomials (25)(模拟)
- Mac的MySQL无法启动的原因