51nod1092(lcs简单运用/dp)
2017-01-14 19:17
281 查看
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1092
题意:中文题诶~
思路:
解法1:最坏的情况就是在原字符串的右边添加该字符串的倒序字符串咯,长度为a.size(),不难想到原字符串和其倒序字符串可能存在公共子序列,公共子序列含有的字符我们是不需要添加的(因为两边原本就有嘛).我们要使添加的字符最少,那么就是找到最大的公共子序列,再用a.size()减去公共子序列含有的字符数目就好啦,即:
ans=a.size()-lcs(a, b), 其中b为a的倒序字符串;
代码:
解法2:
我们可以用dp[i][j]存储从第i个字符开始长度为j的字符串变成会文串需要添加的最少字符,那么初始化:
dp[0][j]=0, dp[1][j]=0,长度为0,1的字符串自然是回文串啦;
状态转移方程式为:
if(a[j]==a[i+j-1] dp[i][j]=dp[i-1][j+1]
else dp[i][j]=min(dp[i-1][j], dp[i-1][j+1])+1
这些还是比较好理解的,直接上代码好了..
代码:
题意:中文题诶~
思路:
解法1:最坏的情况就是在原字符串的右边添加该字符串的倒序字符串咯,长度为a.size(),不难想到原字符串和其倒序字符串可能存在公共子序列,公共子序列含有的字符我们是不需要添加的(因为两边原本就有嘛).我们要使添加的字符最少,那么就是找到最大的公共子序列,再用a.size()减去公共子序列含有的字符数目就好啦,即:
ans=a.size()-lcs(a, b), 其中b为a的倒序字符串;
代码:
1 #include <bits/stdc++.h> 2 #define MAXN 1010 3 using namespace std; 4 5 int dp[MAXN][MAXN]; 6 7 int main(void){ 8 string a, b; 9 cin >> a; 10 b=a; 11 reverse(b.begin(), b.end()); 12 int len=a.size(); 13 for(int i=0; i<len; i++){ 14 for(int j=0; j<len; j++){ 15 if(a[i]==b[j]){ 16 dp[i+1][j+1]=dp[i][j]+1; 17 }else{ 18 dp[i+1][j+1]=max(dp[i+1][j], dp[i][j+1]); 19 } 20 } 21 } 22 cout << len-dp[len][len] << endl; 23 }
解法2:
我们可以用dp[i][j]存储从第i个字符开始长度为j的字符串变成会文串需要添加的最少字符,那么初始化:
dp[0][j]=0, dp[1][j]=0,长度为0,1的字符串自然是回文串啦;
状态转移方程式为:
if(a[j]==a[i+j-1] dp[i][j]=dp[i-1][j+1]
else dp[i][j]=min(dp[i-1][j], dp[i-1][j+1])+1
这些还是比较好理解的,直接上代码好了..
代码:
1 #include <bits/stdc++.h> 2 #define MAXN 1010 3 using namespace std; 4 5 int dp[MAXN][MAXN]; //***dp[i][j]存储从第j个字符开始,长度为i的字符串变成回文串最少需要添加的字符数 6 7 int main(void){ 8 string a; 9 cin >> a; 10 int len=a.size(); 11 for(int i=2; i<=len; i++){ 12 for(int j=0; j<len; j++){ 13 if(a[j]==a[j+i-1]){ 14 dp[i][j]=dp[i-2][j+1]; 15 }else{ 16 dp[i][j]=min(dp[i-1][j], dp[i-1][j+1])+1; 17 } 18 } 19 } 20 cout << dp[len][0] << endl; 21 return 0; 22 }
相关文章推荐
- PM的烦恼---转版本!
- RAID和LVM
- Android Design Support Library - TabLayout的用法
- Java基础-day01-常见的DOS命令
- SDH基础(2)
- Genymotion的安装与eclipse配置教程
- 开箱即用 - Memcache缓存
- Xamarin原生跨平台概述(精简概述,命中要害。PS:无图)
- SQL语句 不足位数补0
- 时序收敛以及 synplify 技巧timing constraint
- 小试牛刀RxJava2之首页检查
- Ubuntu 12.04 LTS上使用WPS及相关字体问题
- mybatis动态SQL语句
- 笔记:QT多线程编程步骤(其一)
- HttpURLConnection—多用途、轻量极的HTTP客户端
- QQ分享本地图片给好友
- 问题十七:怎么用ray tracing画多个球?
- java学习-基础(6)
- 联接excel 两列数据,按值对应
- CSS-带尖角的对话框