NYOJ-37-回文字符串【LCS】
来源:互联网 发布:php 清空输出缓存 编辑:程序博客网 时间:2024/06/10 21:54
回文字符串
时间限制:3000 ms | 内存限制:65535 KB
难度:4
描述
所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如”aba”。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。
输入
第一行给出整数N(0
输出
每行输出所需添加的最少字符数
样例输入
1
Ab3bd
样例输出
2
思路
既然题目上是要求是将字符串补齐为回文串,那么我们就需要找到原来字符串中非回文的部分然后在它对称的位置添加上字符即可,怎么找到非回文部分数量呢?我们如果将非回文部分去掉那么剩下的是回文串,既然是回文串正反肯定都一样,所以我们把原字符串与它的反串找出相同的序列就好了,问题就被转化为LCS问题了。过程见下图
代码
#include <bits/stdc++.h>#define N 1005using namespace std;char s[N],s2[N];int LCS(int l,int l2){ int dp[3][N]; memset(dp,0,sizeof(dp)); for(int i=0; i<l; i++) { for(int j=0; j<l2; j++) { if(s[i]==s2[j]) { dp[i%2+1][j]=dp[(i+1)%2+1][j-1]+1; } else { dp[i%2+1][j]=max(dp[(i+1)%2+1][j],dp[(i)%2+1][j-1]); } } } return dp[(l-1)%2+1][l2-1];}int main(){ int w,l; cin>>w; getchar(); while(w--) { gets(s); l=strlen(s); reverse_copy(s,s+l,s2);//反转s复制到s2 s2[l]=0; printf("%d\n",l-LCS(l,l));//原长度减去匹配长度就是需要补齐的长度 } return 0;}
0 0
- nyoj 37 回文字符串 【LCS】
- NYOJ-37-回文字符串【LCS】
- nyoj 37 回文字符串 【lcs&&dp】
- NYOJ - 37 - 回文字符串(LCS变形)
- nyoj 37 回文字符串(LCS)
- nyoj 回文字符串(LCS)
- nyoj 37 51nod oj 1092 回文字符串 【LCS变形】
- NYOJ-37 回文字符串 —— LCS变形
- NYOJ 37 回文字符串 (lcs最长公共子序列)
- NYOJ 37 回文字符串
- nyoj 37 回文字符串
- nyoj-37-回文字符串
- nyoj 37 回文字符串
- NYOJ 37 回文字符串
- 回文字符串(nyoj 37)
- Nyoj 37 回文字符串
- Nyoj 37 回文字符串
- NYOJ 37 回文字符串
- VBA编程实现EXECL根据表2数据修改表1
- Android使用Intent传递对象的两种方式
- BZOJ3450: Tyvj1952 Easy
- Android Studio项目 目录含义
- Android 多线程编程
- NYOJ-37-回文字符串【LCS】
- Android 使用网络技术
- 身份证号
- Android 中需要掌握的高级技巧
- 【Linux】CentOS升级Python2.7, yum修复,pip修复和lxml安装
- 利用lua的元表追踪table变量的变化
- 文章标题
- Material Design
- java集合系列08番外篇 ArrayList(Collection c)构造器中的bug介绍