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. CentOS 6.5 x86_64系统手动释放内存

    1.查询当前内存使用情况和释放缓存的参数 redismaster 10:29:24 [~] [root] free -m total used free shared buffers cachedMe ...

  2. CSS布局技巧 -- 各种居中

    多行垂直居中 废话少说,直接上例子!!! display:table Html代码: <div class="wrapper"> <div class=" ...

  3. ready与onload的性能

    <!DOCTYPE html> <html> <head> <title>ready与onload的性能</title> <meta ...

  4. 面向对象的OOA、OOD、OOP

    OOA Object-Oriented Analysis:面向对象分析方法 是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题.OOA与结构化分析有较大的区别.OOA所强调的 ...

  5. archlinux 安装过程记录

    2014年安装了一次,使用U盘启动安装的,但是当时网络有问题,断断续续,没有做详细记录. 现在到了杭州,重新来一次. 使用U盘安装 下载ISO :http://mirrors.163.com/arch ...

  6. python subprocess 自动运行实验室程序

    import threading, os, subprocess, time exec_path = "/home/xhz/gems/ruby/amd...../bin/tester.exe ...

  7. 如何在SCENEKIT使用SWIFT RUNTIME动态加载COLLADA文件

    问题:今天接到一个项目,负责弄需求的美眉跟我讲能不能做一个原型能够加载Collada文件,流程如下: 用户用app下载Collada 压缩包(如内购项目) 压缩包解压 展示Collada文件里的内容 ...

  8. Java EE 和 Java Web

    什么是 Java Web 应用程序? Java Web 应用程序会生成包含各种类型的标记语言(HTML 和 XML 等)和动态内容的交互式 Web 页.它通常由 Web 组件组成(如 JavaServ ...

  9. 用js效果做的简单焦点图

    /*js代码*/ <script src="js/js/myfocus-2.0.1.min.js" type="text/javascript">& ...

  10. PHPstudy 无法启动Apache

    今天打安装完phpstudy的时候,启动Apache发现端口被占用,这个端口也就是system端口.如果想要启动服务器必须关掉这个,但是会导致系统无法正常显示. 后来我就在网上搜各种办法,依然没成功. ...