【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. 【Luogu】P1607庙会班车Fair Shuttle(线段树+贪心)

    我不会做贪心题啊……贪心题啊……题啊……啊…… 我真TM菜爆了啊…… 这题就像凌乱的yyy一样,把终点排序,终点相同的按起点排序.然后维护一个查询最大值的线段树.对于一个区间[l,r],如果这个区间已 ...

  2. SPOJ LCS2 Longest Common Substring II ——后缀自动机

    后缀自动机裸题 #include <cstdio> #include <cstring> #include <iostream> #include <algo ...

  3. java面试题之hashcode相等两个类一定相等吗?equals呢?相反呢?

    答:hashcode相等,两个类不一定相等,equals也不一定相等: 反过来,equals相等,hashcode一定相等

  4. msp430项目编程53

    msp430综合项目---扩展项目三53 1.电路工作原理 2.代码(显示部分) 3.代码(功能实现) 4.项目总结

  5. JS基础之BOM对象

    BOM 对象 JavaScript分为 ECMAScript,DOM,BOM. BOM(浏览器对象模型),可以对浏览器窗口进行访问和操作.使用 BOM,开发者可以移动窗口.改变状态栏中的文本以及执行其 ...

  6. Bruce Eckel:编程生涯

    大家总是问一个错误的问题:“我应该学习C++还是Java?”在本文中,我将告诉大伙儿:对于选择编程生涯真正需要关注的是哪些问题. 请注意,这篇文章的目标读者并不是那些已经做出自己选择的人.(对于这些人 ...

  7. 洛谷——P1560 [USACO5.2]蜗牛的旅行Snail Trails

    P1560 [USACO5.2]蜗牛的旅行Snail Trails 题目描述 萨丽·斯内尔(Sally Snail,蜗牛)喜欢在N x N 的棋盘上闲逛(1 < n <= 120). 她总 ...

  8. [ZJOI 2018] 线图

    别想多了我怎么可能会正解呢2333,我只会30分暴力(好像现场拿30分已经不算少了2333,虽然我局的30分不是特别难想). 首先求k次转化的点数显然可以变成求k-1次转化之后的边数,所以我们可以先让 ...

  9. 网络安全(超级详细)零基础带你一步一步走进缓冲区溢出漏洞和shellcode编写!

    零基础带你走进缓冲区溢出,编写shellcode. 写在前面的话:本人是以一个零基础者角度来带着大家去理解缓冲区溢出漏洞,当然如果你是开发者更好. 注:如果有转载请注明出处!创作不易.谢谢合作. 0. ...

  10. go语言学习之路五:Go语言内存分配机制make&new

    Go有两种分配内存的机制,规则很简单,下面来简单介绍一下.1.new函数New()函数可以给一个值类型的数据分配内存(不知道什么是值类型请前往切片那一部分),调用成功后返回一个初始化的内存块指针,同时 ...