UVA - 11404】的更多相关文章

UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求LCS,转移同时维护f[i][j].s为当前状态字典序最小最优解 f[n][n].s的前半部分一定是回文串的前半部分(想想就行了) 当s的长度为奇时要多输出一个(因为这样长度+1,并且字典序保证最小(如axyzb  bzyxa,就是axb|||不全是回文串的原因是后半部分的字典序回文串可能不是最小,多…
 Palindromic Subsequence Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVA 11404 #include <stdio.h> #include <string.h> #include <algorithm> #include <string> #include <iostrea…
UVA 11404 我用了最暴力的做法:考虑\(dp[i][j]\)表示\(S[i..j]\)的最长回文子序列的长度以及字典序最小的那个. 然后转移的时候如下处理:首先\(dp[i][j]\)要取\(dp[i+1][j]\)和\(dp[i][j-1]\)的最大值(因为可以两端中有一个不取), 然后如果\(S[i]=S[j]\),那么我们就可以从\(dp[i+1][j-1]+2\)转移过来,并且字符串也需要更新. 然后比较字典序的时候就直接暴力按位比较. 最后只要注意一下多测把所有dp值都要赋初值…
UVA 11404 - Palindromic Subsequence 求给定字符串的最长回文子序列,长度一样的输出字典序最小的. 对于 [l, r] 区间的最长回文串.他可能是[l+1, r] 和[l, r-1]两个区间的结果. 或者当s[l] == s[r]时,区间[l+1, r-1]的结果再加上以s[l], s[r]为首尾的子序列. dp[l][r] = ans(dp[l][r-1], dp[l+1][r], s[l] + dp[l+1][r-1] + s[r])  dp存的是子序列,即一…
题目传送门 题意:求LPS (Longest Palidromic Subsequence) 最长回文子序列.和回文串不同,子序列是可以不连续的. 分析:1. 推荐->还有一种写法是用了LCS的思想,dp[i][j]表示i到j的最长回文串长度,状态转移方程: 1. dp[j][j+i-1] = dp[j+1][j+i-2] + 2; (str[j] == str[j+i-1]) 2. dp[j][j+i-1] = max (dp[j+1][j+i-1], dp[j][j+i-2]); (str[…
Palindromic Subsequence Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVA. Original ID: 1140464-bit integer IO format: %lld      Java class name: Main   A Subsequence is a sequence obtained by deleting zero or more characte…
https://vjudge.net/problem/UVA-11404 题意: 给定一个由小写字母组成的字符串,删除其中的0个或多个字符,使得剩下的字母(顺序不变)组成一个尽量长的回文串.如果有多解,输出字典序最小的解. 思路: 首先,最长回文子串的长度可以通过正序字符串和逆序字符串进行LCS得出. 但是这道题目麻烦的是还要输出这个回文串,并且字典序得最小. 应用的主要还是LCS的思想方法,不过在进行状态转移的时候,再加上字符串的状态转移. 不过最后得到的字符串不一定是回文串,但是它的前一半肯…
题意:求任意删除字符后所形成的最长回文,并输出字典序最小的方案 把原串反转求LIS,因为转移时不断求字典序最小导致后半部分可能并非回文,所以要前半部分输出两边 话说这方案保存可真暴力 #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<string&…
最长回文子序列可以用求解原串s和反转串rv的LCS来得到,因为要求回文串分奇偶,dp[i][j]保存长度, 要求字典序最小,dp[i][j]应该表示回文子序列的端点,所以边界为单个字符,即i+j=len+1. 这题最麻烦的地方在于字典序,我是写了个比较函数,有点暴力(常数大). 也可以反着定义,这时结点就要保存那个状态的字符串了(这样定义比较字典序的时候常数小) #include<bits/stdc++.h> using namespace std; #define MP make_pair…
题意:给定一个字符串,问删除一些字符,使得它成为一个最长回访串,如果有多个,输出字典序最小的那个. 析: 我们可以把原字符串反转,然后求两个串的LCS,就得到最长回文串,不过要注意一些细节. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <c…