【POJ 1159】Palindrome

近期各种题各种奇葩思路已经司空见惯了。。。又新出个滚动数组= =

该题另一点须要知道

最少须要补充的字母数 = 原序列S的长度 — S和S’的最长公共子串长度

然而窝原本并不知道……然后写出了一个奇葩dp做法 竟然比LCS快0.0

我的思路是从左往右遍历 每一个字符从右往左遍历到他的后一位置 dp数组标记当前位置往右相应匹配字符串左半边的最长序列长度的两倍(即为要删除序列长度) 每找到一个str[i]==str[j] 更新dp[j]为此时最长序列+2(左右对称) 用一个Max存最多的左右对称同样字符 最后输出n-Max即为须要加入的字符

须要注意Max的更新 当在j != i+1处更新时 Max = max(Max,dp[j]+1) 由于此时能够构成奇回文串 i~j之间能够给一个字符”特权”(即不须要在对面加入该字符)

正常的滚动数组做法跟LCS一样了 只是为了防MLE 把一维用0 1代替 由于每遍历i时 i-2及其曾经的dp数组都没用了 相当于清空

代码例如以下:

//滚动数组dp
#include <iostream>
#include <cstdio>
#define sz 5000 using namespace std; int dp[2][sz+1];
char s1[sz+2],s2[sz+2]; int main()
{
int n,i,j,e = 1;
scanf("%d",&n);
scanf("%s",s1+1);
for(i = 1; i <= n; ++i)
{
s2[i] = s1[n-i+1];
}
dp[0][0] = 0;
for(i = 1; i <= n; ++i,e^=1)//e 1 0 1 0变换 达到"滚"的效果
{
for(j = 1; j <= n; ++j)
{
if(s1[i] == s2[j]) dp[e][j] = dp[e^1][j-1]+1;
else dp[e][j] = max(dp[e][j-1],dp[e^1][j]);
}
}
printf("%d\n",n-dp[e^1][n]);
return 0;
}
//窝的另类思路
#include <iostream>
#include <cstdio>
#include <cstring>
#define INF 0x3f3f3f3f using namespace std; char str[5001];
int dp[5001]; int main()
{
int n,i,j,cnt,mm,x;
scanf("%d%s",&n,str);
memset(dp,0,sizeof(dp));
mm = 1;
for(i = 0; i < n; ++i)
{
x = 0;
cnt = 0;
for(j = n-1; j > i; --j)
{
x = max(x,dp[j]);//之前匹配的最长对称序列
if(str[j] == str[i])
{
dp[j] = max(dp[j],cnt+2);//匹配到 则cnt+2(由于左右对称)
if(j == i+1) mm = max(mm,dp[j]);
else mm = max(mm,dp[j]+1);//可构成奇回文
}
cnt = x;//继承当前点未更改前最长对称序列
}
}
printf("%d\n",n-mm);
return 0;
}

【POJ 1159】Palindrome的更多相关文章

  1. 【POJ 3974】 Palindrome

    [题目链接] http://poj.org/problem?id=3974 [算法] 解法1 : 字符串哈希 我们可以分别考虑奇回文子串和偶回文子串,从前往后扫描字符串,然后二分答案,检验可以用哈希 ...

  2. 【POJ 3974】Palindrome

    http://poj.org/problem?id=3974 Manacher模板题.Menci的博客讲得很好 有一点:Menci的代码中的right我感觉是代表能延伸到的最右端点的右边的点,因为r( ...

  3. bzoj 2295: 【POJ Challenge】我爱你啊

    2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec  Memory Limit: 128 MB Description ftiasch是个十分受女生欢迎的同学,所以 ...

  4. 【链表】BZOJ 2288: 【POJ Challenge】生日礼物

    2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 382  Solved: 111[Submit][S ...

  5. BZOJ2288: 【POJ Challenge】生日礼物

    2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 284  Solved: 82[Submit][St ...

  6. BZOJ2293: 【POJ Challenge】吉他英雄

    2293: [POJ Challenge]吉他英雄 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 80  Solved: 59[Submit][Stat ...

  7. BZOJ2287: 【POJ Challenge】消失之物

    2287: [POJ Challenge]消失之物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 254  Solved: 140[Submit][S ...

  8. BZOJ2295: 【POJ Challenge】我爱你啊

    2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 126  Solved: 90[Submit][Sta ...

  9. BZOJ2296: 【POJ Challenge】随机种子

    2296: [POJ Challenge]随机种子 Time Limit: 1 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 114  Solv ...

随机推荐

  1. jQuery中文文档

    http://www.jquery123.com/ http://www.shifone.cc/

  2. 雅礼培训 Problem A 【线段树】

    题意 维护一段区间,支持求区间最大值,区间且,区间或 \(n,q<=2*10^5\) 题解 我们用线段树维护区间最大值 对于and和or运算, and实质就是强行把一些位改为0 or实质就是强行 ...

  3. spring两个核心IOC、AOP

    Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.Spring是于2003 年兴起的一个轻量级的Java 开发框架,由 ...

  4. 【CCF】通信网络 简单搜索

    去重!不然有环就直接挂掉了...0分 #include<iostream> #include<cstdio> #include<string> #include&l ...

  5. rest-assured 将log()中的信息打印到log日志中去的方法

    rest-assured 将log()中的信息打印到log日志中去的方法: ============方法1============== PrintStream fileOutPutStream = n ...

  6. 创建微服务项目后,在谷歌、Safari等浏览器下无法访问的具体原因

    使用SpringBoot开发了一个项目,端口随机给指定了一个,如6666. 可是奇葩的现象出现了,当在谷歌浏览器地址栏中输入localhost:6666访问的时候,提示无法访问. 检查良久,发现代码也 ...

  7. 系统进程的Watchdog

    编写者:李文栋 /rayleeya http://rayleeya.iteye.com/blog/1963408 3.1 Watchdog简介 对于像笔者这样没玩过硬件的纯软程序员来说,第一次看到这个 ...

  8. Java中的类反射

    一.反射的概念 : 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...

  9. 使用fastJson把对象转字符串首字母大小写问题的解决

    例如:文档中要求传输的字段为 但是转成json字符串后却变成了: 解决方式: 在实体类的get方法上添加@JSONField(name = " ") 注解后问题解决: 输出:

  10. 实时获取键盘高度 CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;

    注意:要想实时获取键盘的高度,比如当前如果是中文那么就会增高的.那么需要使用  UIKeyboardFrameEndUserInfoKey 而不是 UIKeyboardFrameBeginUserIn ...