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”,通过观察不难发
现
其最优子结构中每次计算只用到两层数据,因此可以考录建立一个c[2][2005]的动态表来节省空间,代码如下:
#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的更多相关文章

  1. [ACM_动态规划] 轮廓线动态规划——铺放骨牌(状态压缩1)

    Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, af ...

  2. 二维动态规划——Palindrome

    Palindrome Description A palindrome is a symmetrical string, that is, a string read identically from ...

  3. 动态规划——Palindrome Partitioning II

    Palindrome Partitioning II 这个题意思挺好理解,提供一个字符串s,将s分割成多个子串,这些字串都是回文,要求输出分割的最小次数. Example:Input: "a ...

  4. [ACM_动态规划] UVA 12511 Virus [最长公共递增子序列 LCIS 动态规划]

      Virus  We have a log file, which is a sequence of recorded events. Naturally, the timestamps are s ...

  5. [ACM_动态规划] Alignment (将军排队)

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28415#problem/F 题目大意:有n个士兵排成一列,将军想从中抽出最少人数使队伍中 ...

  6. [ACM_动态规划] 找零种类

    问题描述:假设某国的硬币的面值有 1.5.10.50 元四种,输入一个金额 N (正整数,N<=1000),印出符合该金额的硬币组合有多少种. 问题分析: 1.5.10 元组合出 N 元的方法数 ...

  7. [ACM_动态规划] 最长上升子序列(LIS)

    问题描述:给n个数,找出最长子序列并输出 问题分析:本题是DAG(有向无环图)最长路问题,设d[i]为以i结尾的最长链的长度,则状态转移方程为:d[i]=max{0,d[j]|j<i & ...

  8. [ACM_动态规划] 嵌套矩形

    问题描述:有n个矩阵,每个矩阵可以用两个整数a,b来表示 ,表示他的长和宽,矩阵X (a,b) 可以 嵌套 到Y (c,d) 里面当且仅当 a < c &&  b < d  ...

  9. [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索

    1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...

随机推荐

  1. Maven web项目三种运行方式

    http://www.micmiu.com/software/build/maven-web-eclipse-deploy/

  2. js设置本周 本月 本年

    var SetSearchDate = function (sign, sid, eid) {//sign 标识符区分本周本月本年,sid开始时间id,eid结束时间id var now = new ...

  3. Goals100

    Start:2016.4.10 100天目标:jy_ai学习.swift.设计模式        以10天为周期,开始周会,执行内容:自我检讨本周期,并展望下一个周期:目标一:寻找高效方法.1.思考, ...

  4. Servlet下载文件和http响应

    下载文件等: 1.得到公共的内容ServletContext sc = this.getServletContext(); 2.在链接名字后面加个? 一个参数?参数1=值 两个参数?参数1=值& ...

  5. 【转】HTTP POST GET 本质区别详解

    一 原理区别 一般在浏览器中输入网址访问资源都是通过GET方式:在FORM提交中,可以通过Method指定提交方式为GET或者POST,默认为GET提交 Http定义了与服务器交互的不同方法,最基本的 ...

  6. 解决Nginx不支持pathinfo的问题

    server { listen 80; server_name www.zq27.cc zq27.cc; root /data/wwwroot/www.zq27.cc/; access_log off ...

  7. 转载:java 中对类中的属性使用set/get方法的意义和用法

    经常看到有朋友提到类似:对类中的属性使用set/get方法的作用?理论的回答当然是封闭性之类的,但是这样对我们有什么作用呢?为什么要这样设计?我直接使用属性名来访问不是更直接,代码更简洁明了吗?下面我 ...

  8. [C#.NET]

    Control.Refresh - does an Control.Invalidate followed by Control.Update. Refresh: 强制控件使其工作区无效并立即重绘自己 ...

  9. Spring 容器

    Spring提供了两个核心接口:BeanFactory和ApplicationContext,其中applicationContext是BeanFactory的子接口. 他们都可代表Spring容器, ...

  10. eclipse 搭建Swt 环境

    我本是想用java开发一个记事本,开发记事本使用到SWT插件,我从网上找了许多的资料去集成插件,创建我的第一个SWT项目,以下是我搭建SWT环境的过程. 一.查看当前使用的exlipse 版本型号 在 ...