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 ...
随机推荐
- TCP/IP 三次握手,四次断开
TCP/IP 三次握手,四次断开 一.TCP报文格式 TCP/IP协议的详细信息参看<TCP/IP协议详解>三卷 本. 下面是TCP报文格式图: 图 ...
- Spark 下操作 HBase(1.0.0 新 API)
hbase1.0.0版本提供了一些让人激动的功能,并且,在不牺牲稳定性的前提下,引入了新的API.虽然 1.0.0 兼容旧版本的 API,不过还是应该尽早地来熟悉下新版API.并且了解下如何与当下正红 ...
- Eclipse Unable to install breakpoint in XXX
Eclipse Unable to install breakpoint in 的问题, 到window-preferences-java-compiler下面 把Add line number ...
- UVA - 1626 Brackets sequence (区间dp)
题意:给定一个串,可能空串,或由'[',']','(',')'组成.问使其平衡所需添加最少的字符数,并打印平衡后的串. 分析:dp[i][j]表示区间(i,j)最少需添加的字符数. 1.递推. #in ...
- uniapp 小程序实现自定义底部导航栏(tarbar)
在小程序开发中,默认底部导航栏很难满足实际需求,好在官方给出了自定义形式,效果如下: 话不多说,直接上代码 1.组件 custom-tarbar.vue文件 <template> < ...
- POJ 1852:Ants
Ants Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 11754 Accepted: 5167 Description ...
- 洛谷[Luogu] 普及村总结
总结 简单的模拟 交叉模拟 排序 排序EX
- JDK源码阅读-------自学笔记(一)(java.lang.Object重写toString源码)
一.前景提要 Object类中定义有public String toString()方法,其返回值是 String 类型. 二.默认返回组成 类名+@+16进制的hashcode,当使用打印方法打印的 ...
- 干货分享:Research Essay写作规范详解
同学们在刚到国外时觉得一切都很新鲜,感觉到处都在吸引着他们,但是大部分留学生在刚碰到Research Essay便是一头包.其实Research Essay也没有想象中的那么难,只是留学生们初次接触, ...
- JAVA中的指针
不同于CPP,JAVA中不需要程序员对指针进行操作.不过,这不代表JAVA没有指针,事实上,JAVA的指针操作都被底层代码封装了.笔者在初学Java时,虽然就了解了形参,实参,StringBuffer ...