【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的更多相关文章
- 【POJ 3974】 Palindrome
[题目链接] http://poj.org/problem?id=3974 [算法] 解法1 : 字符串哈希 我们可以分别考虑奇回文子串和偶回文子串,从前往后扫描字符串,然后二分答案,检验可以用哈希 ...
- 【POJ 3974】Palindrome
http://poj.org/problem?id=3974 Manacher模板题.Menci的博客讲得很好 有一点:Menci的代码中的right我感觉是代表能延伸到的最右端点的右边的点,因为r( ...
- bzoj 2295: 【POJ Challenge】我爱你啊
2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec Memory Limit: 128 MB Description ftiasch是个十分受女生欢迎的同学,所以 ...
- 【链表】BZOJ 2288: 【POJ Challenge】生日礼物
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 382 Solved: 111[Submit][S ...
- BZOJ2288: 【POJ Challenge】生日礼物
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 284 Solved: 82[Submit][St ...
- BZOJ2293: 【POJ Challenge】吉他英雄
2293: [POJ Challenge]吉他英雄 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 80 Solved: 59[Submit][Stat ...
- BZOJ2287: 【POJ Challenge】消失之物
2287: [POJ Challenge]消失之物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 254 Solved: 140[Submit][S ...
- BZOJ2295: 【POJ Challenge】我爱你啊
2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 126 Solved: 90[Submit][Sta ...
- BZOJ2296: 【POJ Challenge】随机种子
2296: [POJ Challenge]随机种子 Time Limit: 1 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 114 Solv ...
随机推荐
- BZOJ 2154 Crash的数字表格 ——莫比乌斯反演
求$\sum_{i=1}^n\sum_{j=1}^n lcm(i,j)$ 枚举因数 $ans=\sum_{d<=n} F(d) * d$ $F(d)$表示给定范围内两两$\sum_{gcd(i, ...
- BZOJ 1260: [CQOI2007]涂色paint【区间DP】
Description 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字符串表示这个目标:RGBGR. 每次你可以把一段连续 ...
- 转:sudo 的常见用法和参数选项
原文链接:http://wiki.ubuntu.org.cn/Sudo sudo,以其他用户身份执行一个命令. 用法 sudo -h | -K | -V sudo -v [-Akns] [-g gro ...
- 洛谷 P 3371 单元最短路
题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出发点的编号. 接下来M行每行包含三 ...
- Fabrice Bellard其人 ---- FFMPEG及其他……
有些计算机科学家的名字耳熟能详:阿兰·图灵(Alan Turing).高纳德(Donald Knuth).艾兹赫尔·戴克斯特拉(Edsger Dijkstra),这些人的名气甚至大于他们突破性的成就. ...
- MongoDB存储引擎(上)——MMAPv1
3.0版本以前,MongoDB只有一个存储引擎——MMAP,MongoDB3.0引进了一个新的存储引擎——WiredTiger,同时对原有的MMAP引擎进行改进,产生MMAPv1存储引擎,并将其设置为 ...
- Jetson TK1 一:调整屏幕分辨率
先点击分辨率调整的那个对话框,就是1024×768之类的那个,选定一个分辨率,我选的是1366x768(16:9)的那个,然后连续按7下tab按键,然后回车,然后再点击弹出的选项右边一个就能保存了.
- foobar2000播放APE格式音乐的解决办法
要使foobar2000能播放APE格式的音乐需要安装Monkey's Audio Decoder的插件.操作如下: 1.登录官方插件列表,找到Monkey's Audio Decoder插件 官方插 ...
- python内存泄露诊断过程记录pyrasite
工具:pyrasite;包含三个命令行 pyrasite / pyrasite-shell / pyrasite-memory-viewer 安装:gdb meliae urwid 说明:Pyrasi ...
- Java中的反射机制,利用反射访问私有
利用反射,首先是Class对象的获取,之后是Method和Field对象的获取. 以Method为例,从文档中可以看到: getMethod()方法返回的是public的Method对象, 而getD ...