[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> ...
随机推荐
- Numpy 学习之路(1)——数组的创建
数组是Numpy操作的主要对象,也是python数据分析的主要对象,本系列文章是本人在学习Numpy中的笔记. 文章中以下都基于以下方式的numpy导入: import numpy as np fro ...
- G.Interference Signal---河南省第八届程序设计大赛(dp)
G.Interference Signal 时间限制: 2 Sec 内存限制: 128 MB提交: 47 解决: 18[提交][状态] 题目描述 Dr.Kong’s laboratory moni ...
- SharePoint 2013开发入门探索(二)- 列表操作
我们如何用代码对SharePoint列表做些例如增删改查的操作呢?如果您的程序可以部署到服务器上,就可以使用 服务器对象模型,因为服务器对象模型提供的功能最多,限制最少:否则可能要选择客户对象模型等其 ...
- STM32 GPIO外部中断总结
一.STM32中断分组: STM32 的每一个GPIO都能配置成一个外部中断触发源,这点也是 STM32 的强大之处.STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0,PB ...
- SSH项目(struts+spring+hibernate)搭建_代码简化
在上篇讲到SSH框架的搭建后,为了有利于随时能熟练的把一个SSH的项目快速的搭建起来,我又进一步对其了解学习,对代码进行了简化,大家相互讨论学习. 为什么要简化: 如果要做一个大项目,假设项目的ac ...
- JavaScript-事件坐标
事件坐标: 1.参照屏幕左上角e.screenX,e.screenY 2.参照文档显示区左上角:e.clientX||e.x , e.clientY||e.y 3.参照所在父元素的左上角:e.offs ...
- PHP限制提现时间-----周一至周五 9点到17点
$time = time(); $err_msg = '请在周一至周五 9:00-17:00 提交申请!'; $week = date('w', $time); $hour = date('H', $ ...
- Sprint评审会议不是Sprint演示会议
最近,Innolution公司的执行总监.Essential Scrum的作者Ken Rubin在其公司博客上撰写了一篇题为It’s a Sprint Review Not a Sprint Demo ...
- ServiceMix in daemon mode
For development simplicity, we can start Karaf in daemon mode by executing 'bin\admin.bat start root ...
- 【转】Wince中文乱码解决方法
http://www.cnblogs.com/we-hjb/archive/2008/11/27/1342651.html 如果WinCE的默认语言是英语,也没有支持MUI的话,很多中文的应用程序就不 ...