【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】P1602Sramoc问题(堆)

    题目链接 很巧妙的想法.一开始将1~k-1加入堆中,然后每次从堆里取出一个最小的,判断是不是答案,如果不是,那么就枚举新数的末一位加上. 代码如下 #include<cstdio> #in ...

  2. UOJ 274 【清华集训2016】温暖会指引我们前行 ——Link-Cut Tree

    魔法森林高清重置, 只需要维护关于t的最大生成树,然后链上边权求和即可. 直接上LCT 调了将近2h 吃枣药丸 #include <cstdio> #include <cstring ...

  3. 【字符串】BNUOJ 52781 Book Borders

    https://www.bnuoj.com/v3/problem_show.php?pid=52781 [AC] #include<bits/stdc++.h> using namespa ...

  4. Spoj-BGSHOOT

    The problem is about Mr.BG who is a great hunter. Today he has gone to a dense forest for hunting an ...

  5. Java 学习(3):java 对象和类

    目录: --- 对象 --- 类 --- 源文件的声明规则 --- Java 包 对象: 对象是类的一个实例(对象不是找个女朋友),有状态和行为.例如,一条狗是一个对象,它的状态有:颜色.名字.品种: ...

  6. 小机房的树(codevs 2370)

    题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为0到N-1,有两只虫子名叫飘狗和大吉狗,分居在两个不同的节点上.有一天,他们想爬到一个节点上去搞基,但是作为两只虫子, ...

  7. HTML 文档之 Head 最佳实践--摘抄

    HTML 文档之 Head 最佳实践 story 01-10 阅读 353 收藏 0 收藏 这篇文章整理了作者认可的一些最佳实践,写在这里与各位分享 阅读原文折叠收起 HTML 文档之 Head 最佳 ...

  8. zoj 3627#模拟#枚举

    Treasure Hunt II Time Limit: 2 Seconds                                     Memory Limit: 65536 KB    ...

  9. R必学包之dplyr

    http://www.360doc.com/content/17/1204/10/50223086_709726679.shtml

  10. (3)Swing常用组件

    JTextField-文本框 继承自javax.swing.text.JTextComponent类