输入一个字符串Str,输出Str里最长回文子串的长度. 回文串:指aba.abba.cccbccc.aaaa这种左右对称的字符串. 串的子串:一个串的子串指此(字符)串中连续的一部分字符构成的子(字符)串例如 abc 这个串的子串:空串.a.b.c.ab.ac.bc.abc 收起   输入 输入Str(Str的长度 <= 1000) 输出 输出最长回文子串的长度L. 输入样例 daabaac 输出样例 5 ---------------------------------------------…
1088 最长回文子串 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串. 输入一个字符串Str,输出Str里最长回文子串的长度. Input 输入Str(Str的长度 <= 1000) Output 输出最长回文子串的长度L. Input示例 daabaac Output示例 5 [代码]: #include<bits/stdc++.h> using namespace s…
1088 最长回文子串 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串. 输入一个字符串Str,输出Str里最长回文子串的长度. Input 输入Str(Str的长度 <= 1000) Output 输出最长回文子串的长度L. Input示例 daabaac Output示例 5 马拉车算法 #include<iostream> using namespace std;…
#include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; struct node { int w, s; int index; //储存标号 } mouse[]; //小鼠的信息 //先体重,后速度 bool cmp(node a,node b) { if(a.w==b.w) return a.s<b.s; return a…
回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串. 输入一个字符串Str,输出Str里最长回文子串的长度. Input 输入Str(Str的长度 <= 1000(第二题要求为100000)) Output 输出最长回文子串的长度L. Input示例 daabaac Output示例 5解: #include <stdio.h> int main() { ]; ) != EOF) { ; , j, a; s[i] != ; i++) { ; j <= i; j…
#include<iostream> #include<cstdio> using namespace std; int n,f[5002][5002]; char str1[5002],str2[5002]; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>str1[i]; str2[n+1-i]=str1[i];//反过来赋值比较 } for(int i=1;i<=n;i++) { for(…
题目描述 给你一个长度为n且由a和b组成的字符串,你可以删除其中任意的部分(可以不删),使得删除后的子串“变化”次数小于等于m次且最长. 变化:如果a[i]!=a[i+1]则为一次变化.(且新的字符串的首字母必须是'a') 如果初始串全为b,则输出0. 输入描述: 第一行输入两个数n,m.(1 <= n <= 105,0 <= m <= 10) 第二行输入一行长度为n且由a和b组成的字符串 输出描述: 输出一个数字表示最长长度 示例1 输入 8 2 aabbabab 输出 6 说明…
题目链接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=17 分析: i=1 dp[i]=1 i!=1 dp[i]=max(dp[j]+1)  j<i&&a[j]<a[i] 代码如下: #include<bits/stdc++.h> using namespace std; int main() { int n; scanf("%d",&n); getchar(); while(…
问题描述 LG2679 题解 设\(opt[i][j]\)代表A串前\(i\)个,匹配\(B\)串前\(j\)个,选择了\(k\)个子串的方案数. 转移用前缀和优化一下. \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; template <typename Tp> void read(Tp &x){ x=0;char ch=1;int fh; while(ch!='-'&&(ch&…
连题目都不放了,就是标题中说的那样.裸题 于是直接上代码 暑假要来了 好好学习 --炉火照天地,红星乱紫烟. 赧郎明月夜.歌曲动寒川.…
字符子串和字符子序列的区别 字符字串指的是字符串中连续的n个字符:如palindrome中,pa,alind,drome等都属于它的字串 而字符子序列指的是字符串中不一定连续但先后顺序一致的n个字符:如palindrome中,plind,lime属于它的子序列,而mod,rope则不是,因为它们与字符串的字符顺序不一致. Manacher's Algorithm 在计算机科学中,最长回文子串或最长对称因子问题是在一个字符串中查找一个最长的连续的回文的子串,例如“banana”最长回文子串是“an…
1088 最长回文子串  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串. 输入一个字符串Str,输出Str里最长回文子串的长度. Input 输入Str(Str的长度 <= 1000) Output 输出最长回文子串的长度L. Input示例 daabaac Output示例 5 #include <bits/stdc++.h> using namespace std…
1183 编辑距离 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符. 例如将kitten一字转成sitting: sitten (k->s) sittin (e->i) sitting (->g) 所以kitten和sitting的编辑…
[GDOI2016模拟3.15]基因合成 题意: 给一个目标串,要求从空串进行最少的操作次数变成目标串,操作有两种: 在串的头或尾加入一个字符. 把串复制一遍后反向接到串的末尾. 因为有回文操作,所以可以想到一些与回文有关的东西. 如Manacher,回文树-- 这里采用强大的回文树. 首先注意到目标串可以看作是由一个长度为偶数的回文串在首尾加上若干字符得到的一个串. 所以我们可以求出原串中所有的偶回文串,然后再加加减减一下. 但为什么长度为奇数的不用讨论呢? 这是因为长度为奇数的回文串不可能通…
好难啊..根本不会做..基本上是抄Claris... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4044 (luogu)https://www.luogu.org/problemnew/show/P4762 题解: 先观察到三个(ju)性(fei)质(hua): 2操作的结果一定是一个回文串(废话), 最后一个2操作之后只能进行1操作(废话), 只进行1操作花费代价等于字符个数(废话) 三句废话连在一起说: 最后一次…
最长等差数列(51nod 1055) Description N个不同的正整数,找出由这些数组成的最长的等差数列. 例如:1 3 5 6 8 9 10 12 13 14 等差子数列包括(仅包括两项的不列举) 1 3 5 1 5 9 13 3 6 9 12 3 8 13 5 9 13 6 8 10 12 14 其中6 8 10 12 14最长,长度为5. Input Format 第1行:N,N为正整数的数量(3 <= N <= 10000). 第2 - N+1行:N个正整数.(2<= A…
4044: [Cerc2014] Virus synthesis Time Limit: 20 Sec  Memory Limit: 128 MB Description Viruses are usually bad for your health. How about fighting them with... other viruses? In  this problem, you need to find out how to synthesize such good viruses. …
题意:将一个字符串分割成最少的字符串,使得分割出的每个字符串都是回文串.输出最小的分割数. 方法(自己的):先O(n^2)(用某个点或某个空区间开始,每次向左右扩展各一个的方法)处理出所有子串是否回文.然后常规区间dp,ans[i][j]表示i到j的子串的最小划分数.如果i到j的子串本身为回文串,那么ans[i][j]为1,否则枚举所有方案将i到j划分为两个区间,取所有两个区间结果之和的最小值. 方法(其他,大概就是压了一下空间,压了一下时间的常数):http://blog.csdn.net/l…
题目链接: https://codeforces.com/contest/835/problem/D 题意: 一个回文串是\(1\)-回文的,如果一个回文串的左半部分和右半部分一样且都是\(k\)-回文串(右半部分是指长度为该串长度除以二下取整的后缀),则该串为\((k+1)\)回文串,满足该串是\(k\)回文串的最大\(k\)称作该串的回文级别.给定一个串\(s\), 对于每一个\(k=1,2,...,n\)求出该串中有多少个位置不同的\(k\)-回文串.\(n\le 5\times 10^6…
最经典单串: 300. 最长上升子序列 (LIS) https://leetcode-cn.com/problems/longest-increasing-subsequence/submissions/ //GO //经典DP 线性DP //dp[i] 那么 nums[i] 必然要大于 nums[j],才能将 nums[i] 放在nums[j] 后面以形成更长的上升子序列. func lengthOfLIS(nums []int) int { if len(nums) <= 1{ return…
做了一段时间的线性dp的题目是时候做一个总结 线性动态规划无非就是在一个数组上搞嘛, 首先看一个最简单的问题: 一,最长字段和 下面为状态转移方程 for(int i=2;i<=n;i++) { if(dp[i-1]>=0) dp[i]=dp[i-1]+a[i]; else dp[i]=a[i]; } 例题 裸的最长字段和 可以用滚动数组,下面是用滚动数组写的 #include <iostream> #include <algorithm> #include <s…
51nod 1376 最长上升子序列的数量 题解 我们设lis[i]为以位置i结尾的最长上升子序列长度,dp[i]为以位置i结尾的最长上升子序列数量. 显然,dp[i]要从前面的一些位置(设为位置j)的dp转移过来. j要满足下面的条件: j < i a[j] < a[i] lis[j] = lis[i] - 1 dp[i]即为所有满足上述条件的dp[j]之和. 如果我们正常从左到右处理序列,第一条显然可以直接满足(因为大于i的位置还都没处理过). 为了满足第三条,我们可以把lis相同的值放在…
还是回文 时间限制:2000 ms  |  内存限制:65535 KB 难度:3   描述 判断回文串很简单,把字符串变成回文串也不难.现在我们增加点难度,给出一串字符(全部是小写字母),添加或删除一个字符,都会产生一定的花费.那么,将字符串变成回文串的最小花费是多少呢?   输入 多组数据第一个有两个数n,m,分别表示字符的种数和字符串的长度第二行给出一串字符,接下来n行,每行有一个字符(a~z)和两个整数,分别表示添加和删除这个字符的花费所有数都不超过2000 输出 最小花费 样例输入 3…
题意:给一个字符串,构成回文(空也是回文) 其中增删都需要代价.问:代价最少? 思路:把字符串s变空  dp[i][j]表示变成回文的最小代价 for(i=m-1;i>=0;--i)        for(j=i+1;i<w;j++)lsdjfl dp[i][j]=min(dp[i+1][j]+cost[s[i]-'a']],dp[i][j-1]+cost[s[j]-'a'])         if(s[i]==s[j])   dp[i][j]=min(dp[i][j],dp[i+1][j-1…
DP基础_最长公共子串 Description 两个序列的最长公共子串,这个子串要求在序列中是连续的.如:"bab"和"caba" (可以看出来最长公共子串是"ba"或者"ab") 再如下列X和Y两个数字序列的最长公共子串长度是5,7. x序列:  1,5,3,2,3 Y序列: 2,3,5,3,2,5,3 所以,上述X和Y序列的最长公共子串是3. Input 第一行:输入一行两个整数,表示两个序列的长度.空格间隔开. 第二行:…
线性DP经典题. dp[i]表示以i为结尾最大连续和,状态转移方程dp[i] = max (a[i] , dp[i - 1] + a[i]) AC代码: #include<cstdio> #define max(x, y) (x) > (y) ? (x) : (y) const int maxn = 1e6 + 5; const int inf = 1 << 30; int dp[maxn]; int main(){ int n, T; scanf("%d"…
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1218 题解:先要确定这些点是不是属于最长递增序列然后再确定这些数在最长递增序列中出现的次数,如果大于1次显然是可能出现只出现1次肯定是必然出现.那么就是怎么判断是不是属于最长递增序列,这个只要顺着求一下最长递增标一下该点属于长度几然后再逆着求一下最长递减标一下该点属于长度几如果两个下标之和等于最长长度+1那么该点就属于最长递增序列,然后就是求1-len(le…
https://www.cnblogs.com/31415926535x/p/10415694.html 线性dp是很基础的一种动态规划,,经典题和他的变种有很多,比如两个串的LCS,LIS,最大子序列和等等,, 线性dp是用来解决一些 线性区间上的最优化问题 ,, 学这里的东西我感觉主要要理解好问题的子问题来写出转移方程,,还有弄清具体的边界条件就行了,, LCS-最长公共子序列 分析 子序列指的是对于一个串,某些元素的排列与原串所在的顺序一致的串称为原串的一个子序列,,它与子串不同,子串必须…
问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时候要枚举,这样时间复杂度是不可行的. 然后我就想降维度了,只能线性DP,dp[i]表示子串[0,i]的答案.这样可以从i-1转移到i,str[i]单独作一段或者str[i]能和前面的组成回文串,方程如下: dp[i]=min(dp[i-1]+1,dp[j-1]+1) (子串[j,i]是回文串) 现在…
子序列和子串不一样.子串要求必须连续,而子序列不需要连续. 比如说\(\{a_1,a_2\dots a_n\}\),他的子串就是\(\{a_i,a_{i+1},\dots, a_j|1\leq i\leq j\leq n\}\),而子序列就是\(\{a_{t_1},a_{t_2}\dots a_{t_i}|t_1<t_2<\dots<t_n \}\)只要子序列里面元素的顺序仍然保持原序列里面的顺序就可以了,不要求连续 目录 最长上升子序列 $\Theta(n^2)$ DP P1020 […