[ACM_动态规划] Palindrome
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28415#problem/D
题目大意:给一个长为n的字符串,问最少插入几个字符成回文串
解题思路:总长-最长公共(原来的和其倒过来的串)子序列(LCS)
知识详解——LCS:给出两个子序列A,B,求长度最大的公共子序列(如152687和2356984——>568或268);不妨设d(i,j)为A,B的LCS, 则最有子结构为::A[i]=B[j]时,d(i,j)=d(i-1,j-1)+1;否则,d(i,j)=max{d(i-1,j),d(i,j-1)};复杂度为O(m*n),也可用滚动数组法优化。
#include<iostream>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
int c[][];
int main(){
int n;
for(string a,b;cin>>n>>a;){ b=a; //输入a并获得其颠到序列+对c[][]初始化0
reverse(b.begin(),b.end());
memset(c,,sizeof(c)); for(int j=;j<n;j++){ //利用最优子结构求解过程
for(int i=; i<n; i++){
if(a[i]==b[j]) c[i+][j+]=c[i][j]+;
else c[i+][j+] = c[i][j+]>c[i+][j] ? c[i][j+]:c[i+][j];
}
} cout<<n-c[n][n]<<endl;
}
return ;
}
注意: 上面的代码虽然实现了求解,但是 由于开了一个c[2005][2005]的数组所以不幸“Memory Limit Exceeded”,通过观察不难发 |
#include<iostream>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
int c[][];//开一个2层的数组,0层存先前数值,1层存当前数值,每次计算完一层要用1层更新0层
int main(){
int n; for(string a,b;cin>>n>>a;){ b=a;
reverse(b.begin(),b.end());
memset(c,,sizeof(c)); for(int j=;j<n;j++){ for(int i=; i<n; i++){ //用前一层计算下一层
if(a[i]==b[j]) c[][i+]=c[][i]+;
else c[][i+] = c[][i]>c[][i+] ? c[][i]:c[][i+];
}
for(int i=; i<=n; i++) c[][i]=c[][i]; //每次计算完一层要用1层更新0层
} cout<<n-c[][n]<<endl;
}
return ;
}
[ACM_动态规划] Palindrome的更多相关文章
- [ACM_动态规划] 轮廓线动态规划——铺放骨牌(状态压缩1)
Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, af ...
- 二维动态规划——Palindrome
Palindrome Description A palindrome is a symmetrical string, that is, a string read identically from ...
- 动态规划——Palindrome Partitioning II
Palindrome Partitioning II 这个题意思挺好理解,提供一个字符串s,将s分割成多个子串,这些字串都是回文,要求输出分割的最小次数. Example:Input: "a ...
- [ACM_动态规划] UVA 12511 Virus [最长公共递增子序列 LCIS 动态规划]
Virus We have a log file, which is a sequence of recorded events. Naturally, the timestamps are s ...
- [ACM_动态规划] Alignment (将军排队)
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28415#problem/F 题目大意:有n个士兵排成一列,将军想从中抽出最少人数使队伍中 ...
- [ACM_动态规划] 找零种类
问题描述:假设某国的硬币的面值有 1.5.10.50 元四种,输入一个金额 N (正整数,N<=1000),印出符合该金额的硬币组合有多少种. 问题分析: 1.5.10 元组合出 N 元的方法数 ...
- [ACM_动态规划] 最长上升子序列(LIS)
问题描述:给n个数,找出最长子序列并输出 问题分析:本题是DAG(有向无环图)最长路问题,设d[i]为以i结尾的最长链的长度,则状态转移方程为:d[i]=max{0,d[j]|j<i & ...
- [ACM_动态规划] 嵌套矩形
问题描述:有n个矩阵,每个矩阵可以用两个整数a,b来表示 ,表示他的长和宽,矩阵X (a,b) 可以 嵌套 到Y (c,d) 里面当且仅当 a < c && b < d ...
- [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索
1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...
随机推荐
- c# udp局域网通信
udp224.0.0.1 子网上的所有系统224.0.0.2 子网上的所有路由器224.0.0.12 dhcp服务器224.0.1.1 ntp224.0.1.24 wins服务器 http://www ...
- PBX 评测二
//由于诸事繁多,结果评测一拖再拖. 博客园的优化还行啊,PBX220搜索, 第一页,第四个就是上一篇的评测文章. 配置没有什么说的(按照说明/还有这篇无线迷你IPPBX-PBX220). 以下是在公 ...
- XAMARIN +VS2015 ANDROID 开发禁止屏幕自动转动 Portrait,Nosensor
网上有很多java的写法,但是放在C#中都无法使用,其实有时候还是安下心来认真的去看官网文档比在百度或者google来的快的多 this.RequestedOrientation = Android. ...
- selenium隔离环境安装、以及示例
1.virtual虚拟环境---分割项目---类似于创建文件夹---复制主环境 2.Python -n venv +目录 注意须在win环境下 3.激活虚拟环境 目录\Scripts\activate ...
- css怎样让HTML中超出的内容显示为省略号
文字超出了需要隐藏并显示省略号这个在工作中很多时候都要用到,我想很多人都碰到过吧,这个有两种解决方法第一种.用程序开截取字符长度,这个其实也是可以的.第二种就是接下来分享的内容,用css样式来做,话也 ...
- redis连接超时报错
应用程序连接redis超时,报错如下: ERROR DubboServerHandler-xxx.xx.xx.52:20880-thread-172 2016-12-21 15:25:20,429 c ...
- C#内存释放
看微软件的宣传说NET会自动回收内存.以前一直以为NET会自动回收也没有去细看. 近来发现NET下的winForm程序,默认情况下不会自动释放内存.如果是循执行的程序内存会不断增大.具体会大到多少没有 ...
- angular.element的常用方法
addClass()-为每个匹配的元素添加指定的样式类名after()-在匹配元素集合中的每个元素后面插入参数所指定的内容,作为其兄弟节点append()-在每个匹配元素里面的末尾处插入参数内容att ...
- IQueryable<T> 与 ObjectQuery<T> 差异
命名空间:System.Data.Objects程序集: System.Data.Entity(在 System.Data.Entity.dll 中)public class ObjectQuery ...
- CCNA第二章TCP/IP简介考试要点学习笔记
1.描述网络是如何工作的 DoD过程/应用层 -- OSI应用.表示和会话层(定义了结点到结点的应用通信协议以及对用户界面规范的控制): DoD主机到主机层 -- OSI传输层(保证了数据包的 ...