hdu 1513 最大公共子序列

很明显  将串反转与原串求LCS   然后用总长减即可。

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

int max(int a,int b)
{
    return a>b?a:b;
}
int main()
{
    int len,i,j;
    char str[5010],str1[5010];
    int dp[3][5010];
    while(~scanf("%d",&len))
    {
        scanf("%s",str1);
        for(i=0;i<len;i++)
        str[i]=str1[len-i-1];
        str[len]=‘\0‘;
        //printf("%s %s\n",str1,str);
        memset(dp,0,sizeof(dp));
        int Max=0;
        for(i=1;i<=len;i++)
        {
            for(j=1;j<=len;j++)
            {
                if(str1[i-1]==str[j-1])
                {
                    dp[1][j]=dp[0][j-1]+1;
                }
                else
                {
                    dp[1][j]=max(dp[0][j],dp[1][j-1]);
                }
                if(dp[1][j]>Max) Max=dp[1][j];
            }
            for(j=1;j<=len;j++)
            dp[0][j]=dp[1][j];
        }
        printf("%d\n",len-Max);
    }
    return 0;
}
时间: 2024-11-08 17:07:37

hdu 1513 最大公共子序列的相关文章

hdu 1503 最大公共子序列+输出路径

#include<stdio.h> #include<string.h> #include<iostream> using namespace std; int max(int a,int b) { return a>a?a:b; } char str1[110],str2[110]; int mark[110][110]; int deal(int i,int j) { if(i==0&&j==0) return 0; if(mark[i][j]

HDU 1159 Common Subsequence 最大公共子序列

Problem Description A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = <x1, x2, ..., xm> another sequence Z = <z1, z2, ..., zk> is a subsequence of X if there exists a stri

ACM最大公共子序列&amp;&amp;回文串

---恢复内容开始--- 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 in

ACM 最大公共子序列

Description A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = < x1, x2, ..., xm > another sequence Z = < z1, z2, ..., zk > is a subsequence of X if there exists a strictly

HDU 1513 Palindrome

题目就是给一个字符串问最少插入多少个字符能让原字符串变为回文字符串. 算法: 用原串的长度减去原串与翻转后的串的最大公共字串的长度,就是所求答案. 1 //#define LOCAL 2 #include <iostream> 3 #include <cstring> 4 #include <algorithm> 5 #include <cstring> 6 using namespace std; 7 8 const int maxn = 5000 + 5

动态规划(最大公共子序列)

网上关于动态规划的资料很多,看了很多,总结如下: 求原字符串和其反串的最大公共子序列(不是子串,因为可以不连续)的长度(使用动态规划很容易求得) 1)首先是要知道最长公共子序列的长度的动态规划方程 设有字符串a[0...n],b[0...m],下面就是递推公式.字符串a对应的是二维数组num的行,字符串b对应的是二维数组num的列. 2.其次要看的懂求BDCABA与ABCBDAB的最大公共子序列 3.关键代码如下: 1 package com.sxt.bean; 2 3 import java.

HDU 1513 Palindrome(最长公共子序列)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 解题报告:给定一个长度为n的字符串,在这个字符串中插入最少的字符使得这个字符串成为回文串,求这个最少的个数是多少? 一开始以为只是一个普通的DP题,但是按照我的想法敲出来之后怎么样都W了,无奈搜了解题报告,得知其实这个就是一个最长公共子序列问题,就是求这个字符串跟它的逆序的 字符串的最长公共子序列.因为杭电的题内存都要求在32M内存以内,所以很开心的敲出来才发现10^6的数组都开不了,所以只好

hdu1159 最大公共子序列

题意就不用多说了       这道题就是求两个串的最大公共子序列  注意与最大公共子串的区别 最长公共子序列的结构 最长公共子序列的结构有如下表示: 设序列X=<x1, x2, -, xm>和Y=<y1, y2, -, yn>的一个最长公共子序列Z=<z1, z2, -, zk>,则: 1> 若 xm=yn,则 zk=xm=yn,且Zk-1是Xm-1和Yn-1的最长公共子序列: 2> 若 xm≠yn且 zk≠xm ,则 Z是 Xm-1和 Y的最长公共子序列:

经典算法之动态规划--求最大公共子序列

作为新人,之前对C,C++了解的比较少,关于算法方面更是一窍不通,但最近却痴迷上了算法,哪怕是前辈们不屑一顾的东东,我弄明白了后都会欣喜若狂! 今天将遇到的问题和java实现贴出来和同为新人的博友分享,老鸟可以可以直接关网页了. 定义: 子序列:一个给定序列的子序列是再该序列中删去若干元素后得到的序列.即:给定{x1,x2,...,xm}和Z={z1,z2,...,zk},X的子序列是指存在一个严格递增下表序列{i1,i2,...ik} 使得对所有的j=1,2,...k,都有zj=xij.例如: