1. 程式人生 > >poj 1159 Palindrome(最長公共子序列 + 滾動陣列)

poj 1159 Palindrome(最長公共子序列 + 滾動陣列)

http://poj.org/problem?id=1159

題意:給定一個字串,問最少插入多少個字元,使得該字串變成迴文字串。

思路:原字串序列是X,逆序列是Y,則最少需要補充的字母數=X的長度-X和Y的最長公共子序列的長度。這道題重要的是對空間壓縮的處理,資料範圍達到5000,開靜態陣列int會超。這裡用到滾動陣列。節省了空間。

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

int dp[3][5010];
int main()
{
    int len;
    char s1[5010],s2[5010];
    while(~scanf("%d",&len))
    {
        scanf("%s",s1);
        for(int i = 0; i < len; i++)
            s2[i] = s1[len-1-i];
        s2[len] = '\0';

        memset(dp,0,sizeof(dp));
        for(int i = 1; i <= len; i++)
        {
            for(int j = 1; j <= len; j++)
            {
                if(s1[i-1] == s2[j-1])
                    dp[i%2][j] = dp[(i-1)%2][j-1]+1;
                else
                {
                    if(dp[(i-1)%2][j] > dp[i%2][j-1])
                        dp[i%2][j] = dp[(i-1)%2][j];
                    else
                        dp[i%2][j] = dp[i%2][j-1];
                }
            }
        }

        printf("%d\n",len-dp[len%2][len]);
    }
    return 0;
}


相關推薦

poj 1159 Palindrome(公共序列 + 滾動陣列)

http://poj.org/problem?id=1159 題意:給定一個字串,問最少插入多少個字元,使得該字串變成迴文字串。 思路:原字串序列是X,逆序列是Y,則最少需要補充的字母數=X的長度-X

POJ 1159 Palindrome 公共序列+滾動陣列

題目描述: A palindrome is a symmetrical string, that is, a string read identically from left to right as well as from right to left. You ar

poj 1159Palindrome DP(類公共序列)+滾動陣列

Palindrome Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 58492 Accepted: 20318 Description A palindrom

poj 1159 Palindrome公共序列+滾動陣列

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 writ

1159 Palindrome(迴文串&LCS公共序列&滾動陣列)

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

HDU:1513 Palindrome(迴文字串+公共序列+滾動陣列

Palindrome Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5246    Accepted Subm

公共序列滾動陣列寫法

如poj1159,普通寫法會mle滾動陣列可以解決,原因在於普通的dp寫法雖然一層套一層,但是實際上僅僅使用了該層和上一層,所以可以據此優化。PS.解釋圖片來自網路,圖片原本來自演算法導論#include<iostream> #include<cstdio&

POJ 1458(公共序列

Time Limit: 1000MS Memory Limit: 10000K Description A subsequence of a given sequence is the given sequence with some elemen

poj——1159(dp之公共序列

注:C++執行時Runtime Error,G++過了。(這編譯器,真無語了)。 #include <iostream> #include <cmath> #include

POJ 1159 公共序列的應用

DP已經弱到不能再弱的程度了。。。。那就從最基本的做起吧!! 看隊友部落格裡面有這題,做了,讀完題,沒思路,才知道,一個叫最長公共子序列的東西不知道(注意與最長公共子串分開) 最長公共子序列作法: dp[i][j] 表示s1串中前i個字元,s2串中前j個字元所組成的兩個串的

【mark】公共序列poj 1458+hdu 1159

經典的問題,在各大部落格上有數不清的好帖子 下面為最常見的n^2演算法 #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #inclu

POJ 1458/HDU 1159 公共序列 (動態規劃)

題目連結:poj && hdu 程式碼 #include <iostream> #include <cstdio> #include <algo

Human Gene Functions POJ 1080 公共序列變形

cee diff print bmi ces -s compare %d determine Description It is well known that a human gene can be considered as a sequence, consisting

[poj 2274]後綴數組+公共序列

max %d eight har 題目 while color sca 鏈接 題目鏈接:http://poj.org/problem?id=2774 後綴數組真的太強大了,原本dp是n^2的復雜度,在這裏只需要O(n+m)。 做法:將兩個串中間夾一個未出現過的字符接起來,然

HDU 1513 Palindrome:LCS(公共序列)or 記憶化搜索

ble urn size rom str 個數 blog using reverse 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 題意:   給你一個字符串s,你可以在s中的任意位置添加任意字符,問你將s變成一個回

POJ 1458 - Common Subsequence(公共序列) 題解

void 方式 mem strong 輸出 inline ron eof init 此文為博主原創題解,轉載時請通知博主,並把原文鏈接放在正文醒目位置。 題目鏈接:http://poj.org/problem?id=1458 題目大意: 有若幹組數據,每組給出兩個字符

POJ-1458 公共序列

這個題的意思就是說: 給一個序列 A 和 B ,讓你求他們的共同的子序列的長度,這些子序列可以不在原來的字串中連續排列。 這個題的話,我們可以使用動態規劃的思路,我們假設 MaxLen [ i ] [ j ] 是 A 串和 B 串中從一開始的,A 串中的的第 i 個字元和B 串中的第 j 個

POJ 1458 簡單dp 公共序列

要求:輸出最長公共子序列的長度 方法:dp裸題 1.狀態:dp[i][j]表示第一個序列的前i個字元和第二個序列的前j個字元的最長公共子序列的長度。 2.狀態轉移方程在程式碼中。 3.首要是程式碼規範化,然後才是找bug。 #include<stdio.h> #inc

poj~公共序列公共

最長公共子序列 poj1458 問題描述 給出兩個字串,求出這樣的一個最長的公共子序列的長度: 子序列中的每個字元都能在兩個原串中找到, 而且每個字元的先後順序和原串中的先後順序一致。 S

poj公共序列公共

Description A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X =