HDU 1513 最长子序列

Palindrome

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3641    Accepted Submission(s): 1252

Problem Description

A palindrome is a symmetrical string, that is, a string read identically from left to right as well as from right to left. You are to write a program which, given a string, determines the minimal number of characters to be inserted into the string in order to obtain a palindrome.

As an example, by inserting 2 characters, the string "Ab3bd" can be transformed into a palindrome ("dAb3bAd" or "Adb3bdA"). However, inserting fewer than 2 characters does not produce a palindrome.

Input

Your program is to read from standard input. The first line contains one integer: the length of the input string N, 3 <= N <= 5000. The second line contains one string with length N. The string is formed from uppercase letters from ‘A‘ to ‘Z‘, lowercase letters from ‘a‘ to ‘z‘ and digits from ‘0‘ to ‘9‘. Uppercase and lowercase letters are to be considered distinct.

Output

Your program is to write to standard output. The first line contains one integer, which is the desired minimal number.

Sample Input

5

Ab3bd

Sample Output

2

Source

IOI 2000

题目意思:

给一个长度为n的字符串,问最少添加多少字符使得该字符串成为回文串。

思路:

把原串倒过来,两个串取最长子序列m,然后n-m即为加的字符数。子序列长度最长,意味着添加的字符数最少。

由于n太大,需要用滚动数组。

dp[i&1][j]表示dp[i][j];  dp[!(i&1)][j]表示dp[i-1][j]

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <iostream>
 5 #include <vector>
 6 #include <queue>
 7 #include <cmath>
 8 #include <set>
 9 using namespace std;
10
11 #define N 5005
12
13 int max(int x,int y){return x>y?x:y;}
14 int min(int x,int y){return x<y?x:y;}
15 int abs(int x,int y){return x<0?-x:x;}
16
17
18 int dp[2][N];
19 int n;
20 char s[N];
21
22 main()
23 {
24     int i, j, k;
25     while(scanf("%d",&n)==1){
26         memset(dp,0,sizeof(dp));
27         scanf("%s",s+1);
28         char s1[N];
29         for(i=n;i>=1;i--) s1[i]=s[n-i+1];
30         int maxh=0;
31         for(i=1;i<=n;i++){
32             memset(dp[i&1],0,sizeof(dp[i&1]));
33             for(j=1;j<=n;j++){
34                 if(s[i]==s1[j]){
35                     dp[i&1][j]=max(dp[!(i&1)][j-1]+1,dp[i&1][j]);
36                 }
37                 else dp[i&1][j]=max(dp[!(i&1)][j],dp[i&1][j-1]);
38                 maxh=max(maxh,dp[i&1][j]);
39             }
40         }
41         printf("%d\n",n-maxh);
42     }
43 }
时间: 2024-08-03 07:38:36

HDU 1513 最长子序列的相关文章

HDU 1160 FatMouse&#39;s Speed--dP--(元素1递增元素2递降的最长子序列)

题意:找到体重递增速度递降的最长序列 分析:和最长递增子序列一样,不过这里先做处理:先把体重按递增排序,然后找最长递降子序列即可 代码: #include<iostream> #include<algorithm> #include<cstdio> using namespace std; struct node{ int w,s; int t; }a[2000]; int n,i; struct h{ int x; int pre; }dp[2000]; int an

HDU 1422 重温世界杯--(最长子序列模型,bug)

题意:按照输入的城市序列的顺序环游世界,每个城市有补助和花费,如果补助大于花费,你可以保存剩下的钱以后还能用,如果补助加上你保存的钱小于花费则停止旅游.求最多能去多少城市 分析:这题跟求最长子序列差不多,dp[i]表示走第i个城市时最多经过的城市的数量,如果第i个城市的花费够用那么 dp[i]=dp[i-1]+1,复杂度是 O(n) 这题主要卡在:1.TLE.原因是输入输出用的cin,cout换成标准输入输出就好了 2.WA.以前经过的城市没用完的费用可以留着以后用,这需要用一个tmp保存:城市

nyoj 题目17 单调递增最长子序列

单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行一个整数0<n<20,表示有n个字符串要处理随后的n行,每行有一个字符串,该字符串的长度不会超过10000 输出 输出字符串的最长递增子序列的长度 样例输入 3 aaa ababc abklmncdefg 样例输出 1 3 7 复习了利用二分搜索和额外空间解决最长递增子序列问题,最重要的是二分搜索的

单调递增最长子序列(南阳oj17)(经典dp)

单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行一个整数0<n<20,表示有n个字符串要处理 随后的n行,每行有一个字符串,该字符串的长度不会超过10000 输出 输出字符串的最长递增子序列的长度 样例输入 3 aaa ababc abklmncdefg 样例输出 1 3 7 来源 经典题目 上传者 iphxer #include<std

NYOJ 17 单调递增最长子序列

单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行一个整数0<n<20,表示有n个字符串要处理 随后的n行,每行有一个字符串,该字符串的长度不会超过10000 输出 输出字符串的最长递增子序列的长度 样例输入 3 aaa ababc abklmncdefg 样例输出 1 3 7 动归,不多说,看代码: #include<stdio.h>

算法实验--最长子序列

一.实验目的: 熟悉掌握动态规划法设计技术 二.实验要求: 1.按教材所授内容要求,完成“最长公共子序列问题”算法.得到一个完整正确的程序. 2.问题规模:不少于100 3.输出最终结果. 三.实验设备: PC机一台 Vc++6.0编译软件一套 四.问题描述: 若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij.例如,序列Z={B,C,D,B}是序列X={A

最长子序列问题 最详细的解题报告

最长子序列之和问题 算法一:暴力法(时间复杂度:O(N^2)) 算法描述:依次求从j到i中最大的和,并将最大的和记录在maxValue中,容易理解但是效率低. 1 static int MaxSum1(int[] arr) { 2 int maxValue = Integer.MIN_VALUE; 3 for (int i = 0; i < arr.length; i++) { 4 int curSum = 0; 5 for (int j = 0; j <= i; j++) { 6 curSu

erlang 小程序:整数序列,搜索和为正的最长子序列

最近学习了一下erlang, 编了个小程序 算法如下: 把参数分为三个 当前位置的前子序列(Save)(比如 -5, 1,2,-1, _, ... ) 前位置为_时, 前子序列就是 1,2,-1 以及此子序列的和(CurSum) ( 1,2,-1的 CurSum 是 2) 剩余的数 Rest:  剩余的数也可以表示为 [H|T] ,H是第一元素,T为剩余的元素是列表 处理过程如下: 如果 Rest 为空,说明处理完毕,打印 CurSum和Save 如果,还剩一个元素(Rest只有一个元素) 如果

【动态规划】单调递增最长子序列

问题 D: [动态规划]单调递增最长子序列 时间限制: 1 Sec  内存限制: 128 MB提交: 36  解决: 25[提交][状态][讨论版] 题目描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行一个整数0<n<20,表示有n个字符串要处理 随后的n行,每行有一个字符串,该字符串的长度不会超过10000 输出 输出字符串的最长递增子序列的长度 样例输入 3 aaa ababc abklmncdefg 样例输出 1 3 7 解题思