动态规划(DP),压缩状态,插入字符构成回文字符串
题目链接:http://poj.org/problem?id=1159
解题报告:
1、LCS的状态转移方程为
if(str[i-1]==str[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
2、由于开不了dp[5005][5005],于是考虑到压缩状态
这里采用滚动数组方式,LCS的状态转移方程可以改写为
if(str1[i-]==str2[j-])
{
dp[i%][j]=dp[(i-)%][j-]+;
}
else dp[i%][j]=max(dp[(i-)%][j],dp[i%][j-]);
- Source Code
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <iostream>
#define MAX 5005 using namespace std;
///LCS的状态转移方程,d[i][j]=max(d[i-1][j],d[i][j-1]);
///LCS的滚动数组形式的状态转移方程,d[i%2][j]=max(d[(i-1)%2][j],d[i%2][j-1])
int dp[2][MAX];///滚动数组 int main()
{
char str1[MAX],str2[MAX];
int n;
cin>>n;
cin>>str1;
for(int i=0; i<n; i++)
str2[n-i-1]=str1[i];
memset(dp,0,sizeof(dp));
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
if(str1[i-1]==str2[j-1])
{
dp[i%2][j]=dp[(i-1)%2][j-1]+1;
}
else dp[i%2][j]=max(dp[(i-1)%2][j],dp[i%2][j-1]);
}
}
printf("%d\n",n-dp[n%2][n]);
return 0;
}
动态规划(DP),压缩状态,插入字符构成回文字符串的更多相关文章
- hiho 1323 : 回文字符串 dp
#1323 : 回文字符串 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个字符串 S ,最少需要几次增删改操作可以把 S 变成一个回文字符串? 一次操作可以在任 ...
- nyist oj 37 回文字符串 (动态规划经典)
回文字符串 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描写叙述 所谓回文字符串,就是一个字符串.从左到右读和从右到左读是全然一样的.比方"aba".当 ...
- 【HIHOCODER 1323】回文字符串(区间DP)
描述 给定一个字符串 S ,最少需要几次增删改操作可以把 S 变成一个回文字符串? 一次操作可以在任意位置插入一个字符,或者删除任意一个字符,或者把任意一个字符修改成任意其他字符. 输入 字符串 S. ...
- hihocoder 1323 - 回文字符串 - [hiho一下162周][区间dp]
用dp[i][j]表示把[i,j]的字符串str改写成回文串需要的最小操作步数. 并且假设所有dp[ii][jj] (ii>i , jj<j)都为已知,即包括dp[i+1][j].dp[i ...
- nyoj 37 回文字符串 【DP】
先反向复制一个新的字符串,然后再找出最长公共子串,在用长度n减去就可以 回文字符串 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描写叙述 所谓回文字符串,就是一个字符串,从 ...
- hihocoder 1323 回文字符串(字符串+dp)
题解: 比较水的题目 dp[i][j]表示[i...j]最少改变几次变成回文字符串 那么有三种转移 dp[i][j] = dp[i+1][j-1] + s[i] != s[j] dp[i][j] = ...
- 51Nod - 1092 回文字符串(添加删除字符LCS变形)
回文字符串 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串.每个字符串都可以通过向中间添加一些字符,使之变为回文字符串. 例如:abbc 添加2个字符可以变为 acbbca, ...
- (DP)51NOD 1006 最长公共子序列&1092 回文字符串
1006 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abc ...
- 【51nod 1092】 回文字符串(区间DP)
回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串.每个字符串都可以通过向中间添加一些字符,使之变为回文字符串. 例如:abbc 添加2个字符可以变为 acbbca,也可以添加3 ...
随机推荐
- VUE--mixins的一些理解。
概念:混入 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式.混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项. 用法: 1.创建混 ...
- oracle 单实例DG(搭建篇一)
一,介绍 lodding... 二,安装前环境配置 01,依赖包的安装: yum install binutils-* yum install compat-libstdc++-* yum insta ...
- day07 - Python - 面向对象进阶
本节内容: 面向对象高级语法部分异常处理异常处理异常处理 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 1 ...
- net.sf.json.JSONException: There is a cycle in the hierarchy! 转json死循环问题解决
解决上述问题遵照两个原则就可以: 1.页面不需要展示关联数据时 解决:将关联对象属性排除掉 2.页面需要展示关联数据时 解决:将关联对象改为立即加载,并且将关联对象中的属性排除
- 3、java内存模型特点
java内存模型是围绕着在并发过程中如何处理原子性,可见性跟有序性这三个问题来建立的.先看一下这三个特性: 1.原子性 由java内存模型来直接保证的原子性变量操作就是上文2中提到的8种基本操作,我们 ...
- CMD 模块定义规范【转】
在 Sea.js 中,所有 JavaScript 模块都遵循 CMD(Common Module Definition) 模块定义规范.该规范明确了模块的基本书写格式和基本交互规则. 在 CMD 规范 ...
- java线程中的 sleep() wait() yield()
sleep()方法是让线程休眠 可以指定时间 其实就是让线程进入阻塞状态 指定的时间过后 进入就绪状态 不释锁 相当于抱着锁睡觉 wait() 让线程进入等待状态 被唤醒后才会继续执行 ...
- 开源TSDB简介--Druid
开源TSDB简介--Druid Druid是一个以Java编写的开源分布式列式数据存储. Druid的目标是快速提取大量事件数据,并提供低延迟的查询. 德鲁伊的名字来源于许多角色扮演游戏中的变形德鲁伊 ...
- Ubuntu系统修改Python软链接
1.查看使用的版本 python --version 2.查看当前所使用版本的位置 which python 3.如果第二步结果是 /usr/bin/python 则直接删除即可 sudo rm /u ...
- [SDOI2013]刺客信条
Description 故事发生在1486 年的意大利,Ezio 原本只是一个文艺复兴时期的贵族,后来因为家族成员受到圣殿骑士的杀害,决心成为一名刺客.最终,凭借着他的努力和出众的天赋,成为了杰出的刺 ...