UVA 11404 简单LCS模型DP 字典序比较
这个题目求某个字符串中含的最长的回文子串。
就是一个很简单的LCS模型吗,而且我不明白为什么网上这么多人都说仿照某写法把字符串先逆序一下,然后求LCS,我只想问一下,有必要吗?
直接按LCS的套路来就行了啊,只不过方式变了下,按上面的写法,又麻烦,又根本没利用的LCS的精髓思想
即,先从间隔0位开始做起,然后是间隔1位。。2.。。n-1位,d[i][j]代表i到j的最长回文串个数
于是就有 s[i]==s[j] d[i][j]=d[i+1][j-1]+2,否则就取 max(f[i+1][j],f[i][j-1]),不就行啦。还用得着上面那样搞?
不过如果这个问题这么简单我也不会放到博客里来写了。主要是下面的问题,我还确实一开始没想到。
比较麻烦的是当出现多个情况的时候 输出字典序小的,我一开始没想谨慎,很快的敲了,用个数组直接记录子串的字母的ASCII码值和,比较这个和来确定字典序,后来WA了几次才醒悟,这里肯定不能简单求ASCII和啊,比如 一个字符串里同时存在 adda和bccb,按我的做法,不是任意输出一个都行、、、显然不对嘛
所以这个还是直接在计算的过程中,就把字符串求出来比较好,即按上面的推法,如果s[i]==s[j],把s[i]+已有回文串+s[j]组成新串即可,但是有个问题是,没有字符串函数是可以进行字符串的连接重组的,难道手写?还好C++的string是很强大的,直接可以进行+操作,并且可以直接进行比值,比出来直接就是字典序,那简直方便得不得了啊。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#define INF 1<<30
using namespace std;
int d[][];
double cnt[][];
string str[][];
char s[];
int len;
//void print(int l,int r)
//{
// if (l>r) return;
// if (s[l]==s[r])
// {
// printf("%c",s[l]);
// print(l+1,r-1);
// if (l<r)
// printf("%c",s[r]);
// return;
// }
// if (d[l+1][r]>d[l][r-1])
// {
// print(l+1,r);
// return;
// }
// if (d[l+1][r]<d[l][r-1])
// {
// print(l,r-1);
// return;
// }
// if (d[l+1][r]==d[l][r-1])
// {
// if (cnt[l+1][r]<cnt[l][r-1])
// {
// print(l+1,r);
// }
// else
// print(l,r-1);
// }
//
//}
int main()
{
while (scanf("%s",&s)!=EOF)
{
len=strlen(s);
memset(d,,sizeof d);
// memset(cnt,0,sizeof cnt);
for (int i=;i<len;i++)
{
for (int j=;j+i<len;j++)
{
int k=j+i;
int chj=s[j];
int chk=s[k];
if (s[j]==s[k])
{
if (i==)
{
d[j][k]=;
str[j][k]=s[j];
}
else{
d[j][k]=d[j+][k-]+;
str[j][k]=s[j]+str[j+][k-]+s[k];
}
}
else
{
if (d[j][k-]>d[j+][k])
{
d[j][k]=d[j][k-];
str[j][k]=str[j][k-];
}
else
if (d[j][k-]<d[j+][k])
{
d[j][k]=d[j+][k];
str[j][k]=str[j+][k];
}
else
if (d[j][k-]==d[j+][k])
{
d[j][k]=d[j+][k];
if (str[j][k-]<str[j+][k]) //直接string进行比值操作就可知道字典序大小
str[j][k]=str[j][k-];
else
str[j][k]=str[j+][k];
}
}
}
}
cout<<str[][len-]<<endl;//直接输出该string即可
//print(0,len-1);
//printf("\n");
}
return ;
}
UVA 11404 简单LCS模型DP 字典序比较的更多相关文章
- 【UVa】Palindromic Subsequence(dp+字典序)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=465&page=s ...
- UVA 11404 Palindromic Subsequence[DP LCS 打印]
UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...
- uva 11404 dp
UVA 11404 - Palindromic Subsequence 求给定字符串的最长回文子序列,长度一样的输出字典序最小的. 对于 [l, r] 区间的最长回文串.他可能是[l+1, r] 和[ ...
- UVA.10066 The Twin Towers (DP LCS)
UVA.10066 The Twin Towers (DP LCS) 题意分析 有2座塔,分别由不同长度的石块组成.现在要求移走一些石块,使得这2座塔的高度相同,求高度最大是多少. 问题的实质可以转化 ...
- 【UVA 11404】Palindromic Subsequence
UVA 11404 我用了最暴力的做法:考虑\(dp[i][j]\)表示\(S[i..j]\)的最长回文子序列的长度以及字典序最小的那个. 然后转移的时候如下处理:首先\(dp[i][j]\)要取\( ...
- LPS UVA 11404 Palindromic Subsequence
题目传送门 题意:求LPS (Longest Palidromic Subsequence) 最长回文子序列.和回文串不同,子序列是可以不连续的. 分析:1. 推荐->还有一种写法是用了LCS的 ...
- UVA 11404 五 Palindromic Subsequence
Palindromic Subsequence Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu ...
- UVA 10003 Cutting Sticks 区间DP+记忆化搜索
UVA 10003 Cutting Sticks+区间DP 纵有疾风起 题目大意 有一个长为L的木棍,木棍中间有n个切点.每次切割的费用为当前木棍的长度.求切割木棍的最小费用 输入输出 第一行是木棍的 ...
- 炸金花游戏(3)--基于EV(期望收益)的简单AI模型
前言: 炸金花这款游戏, 从技术的角度来说, 比德州差了很多. 所以他的AI模型也相对简单一些. 本文从EV(期望收益)的角度, 来尝试构建一个简单的炸金花AI. 相关文章: 德州扑克AI--Prog ...
随机推荐
- C++ 语言程序设计(清华大学)2
面向对象 1.面向对象程序基本特点:抽象.封装.继承.多态 2.类分为:公有类型成员public(接口),私有类型成员private(本类函数访问,类外要用友元函数访问),保护类型成员protect( ...
- ubuntu18.04下安装oh-my-zsh
安装 sudo apt-get install zsh wget --no-check-certificate https://github.com/robbyrussell/oh-my-zsh/ra ...
- docker 构建php-fpm IMages(dockerfile)
好久没写blog 做什么? 复习nginx zabbix docker-compos mariadb 学习 jenkins ansible ELK k8s (kubeadm) 好了也 ...
- 云服务器CentOS7系统环境配置(jdk和tomcat)
配置jdk 下载与安装 如果没有安装wget,首先安装wget工具 yum -y install wget 安装完成后,在网上找到jdk的下载链接,可以在官网找点击此处到官网下载,如果官网下载慢也可以 ...
- Golang的单目(一元)运算符-地址操作符和接收操作符
Golang的单目(一元)运算符-地址操作符和接收操作符 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Golang的单目(一元)运算符概述 常见的地址操作符: &: ...
- 项目中常用的JS操作技巧
1.<a>标签-超链接中confirm方法使用介绍 <a href="a.html" onclick="if(confirm('确定删除?')==fal ...
- Spring Boot2(007):关于Spring beans、依赖注入 和 @SpringBootApplication 注解
一.关于Spring beans 和 依赖注入(Dependency Injection) spring boot 和 Spring 全家桶无缝衔接,开发过程中可以很轻松地使用 Spring 全家桶的 ...
- python 编写程序输出50以内勾股数,如下图所示,要求每组显示六祖,各组勾股数无重复
import math n = 0 for a in range(1,49): for b in range(a,49): c = math.ceil(math.sqrt(a**2+b**2)) if ...
- 7. 单机版Redis的安装以及Redis生产环境启动方案
安装单机版redis redis的生产环境启动方案redis cli的使用 1. 安装单机版redis 大家可以自己去官网下载,当然也可以用课程提供的压缩包 wget http://downloads ...
- Java 统计整数二进制中1的个数
package cookie; public class CountBinary_1 { public static void main(String[] args) { System.out.pri ...