1. 程式人生 > >hdu 1513 Palindrome【LCS滾動陣列】

hdu 1513 Palindrome【LCS滾動陣列】

連結:

Palindrome

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


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
Recommend linle

題意:

先給你字串的長度 N  再給你 N 個字元組成的序列,問最小多少個操作【新增一些字元】可以將原來的序列變成迴文串

分析:

就是逆序存一下當前序列,然後求出 LCS 【最長公共子序列】 用 N 減去所求的最長公共子序列就可以了 注意到序列很長 5000 如果用裸 dp[5000][5000] 就 MLE 了, 以前在 POJ 上做過這道題, 記憶體是 hdu  的兩倍,看過一篇部落格是關於記憶化儲存的陣列開 dp[maxn][maxn] short int 隨便就搞過去了,然後前天晚上就一直 MLE 啊Orz  完了學妹對我說 %2 開個 dp[2][5000] 就可以過了。。。 也就是前一篇部落格的滾動陣列思想:

hdu 1159 Common Subsequence 【LCS 基礎入門】

當前這一行的狀態只由上一行的狀態和這一行前面的狀態確定,所以只有記錄兩組Orz 也就是說直接把 裸的 LCS 的陣列定義改成 dp[2][maxn], 然後把裸的模板中的 i 全部 %2 就好了 最後輸出 n - dp[n%2][n]

code:

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

const int maxn = 5005;
int dp[2][maxn];
char s1[maxn], s2[maxn];

void LCS(int len1,int len2)
{
    for(int i = 1; i <= len1; i++)
    {
        for(int j = 1; j <= len2; j++)
        {
            if(s1[i-1] == s2[j-1]) dp[i%2][j] = dp[(i-1)%2][j-1]+1;
            else
            {
                int m1 = dp[(i-1)%2][j];
                int m2 = dp[i%2][j-1];
                dp[i%2][j] = max(m1, m2);
            }
        }
    }
}

int main()
{
    int n;
    while(scanf("%d", &n) != EOF)
    {
        scanf("%s", s1);
        for(int i = 0; i < n; i++)
        s2[i] = s1[n-i-1];
            memset(dp,0,sizeof(dp));
        LCS(n,n);
        printf("%d\n", n-dp[n%2][n]);
    }
    return 0;
}


相關推薦

hdu 1513 PalindromeLCS滾動陣列

連結: Palindrome Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2430    Accepted Sub

POJ 1159 PalindromeLCS+滾動陣列水題

Palindrome Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 63833 Accepted: 22254 Description A palindrome is a symmetr

HDU 1513 PalindromeLCS(最長公共子序列)or 記憶化搜索

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

HDU 4427 Math Magicdp+優化+滾動陣列好題

Yesterday, my teacher taught us about math: +, -, *, /, GCD, LCM... As you know, LCM (Least common multiple) of two positive numbers can be solved easily

POJ-3666 Making the Grade 動態規劃DP+滾動陣列

題目傳送門 題目:輸入n個數,第i個數字的值為a[i],把第i個數變為j的代價為a[i]-j的絕對值,求把這n個數組成的數列變成單調數列的最小代價。 題解:dp[i][j]表示前i個數最大值為b[j]時的最小代價,即第i個數在總數列中的值為第j小的時候的最小代價。 動態轉移方程:dp

hdu 1166 敵兵佈陣單點更新 區間查詢樹狀陣列

敵兵佈陣 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 126415    Accepted Submissi

HDU 5592 ZYB's Game 樹狀陣列+二分

<題目連結> 題目大意: 給你一個由1~n,n個數組成的序列,給出他們每個的字首逆序數,現在要求輸出這個序列。 解題分析: 由字首逆序數很容易能夠得到每個數的逆序數。假設當前數是i,它前面比它小的數為a[i]( i - 1 - i的逆序數即可),我們不難知道,i在前i個數中是第i+1大的。

hdu 1556 Color the ball 樹狀陣列

Time limit 3000 ms Memory limit 32768 kB OS Windows Source N個氣球排成一排,從左到右依次編號為1,2,3....N.每次給定2個整數a b(a <= b),lele便為騎上他的“小飛鴿"牌

滾動陣列狀壓DPNOI2001炮兵陣地

題目描述 司令部的將軍們打算在N*M的網格地圖上部署他們的炮兵部隊。一個N*M的地圖由N行M列組成,地圖的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下圖。在每一格平原地形上最多可以佈置一支炮兵部隊(山地上不能夠部署炮兵部隊);一支炮兵部隊在地圖上的攻擊範圍

hdu 1159 Common Subsequence LCS 基礎入門

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

KMP nx陣列求字串首尾和中間都出現的最長子串 HDU

Theme Section Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4961    Accepted S

HDU 1015 Safecracker數值型DFS

print position bili iostream floor always mem csdn aps Safecracker Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K

HDU 4463 Outlets 最小生成樹

let .net 鏈接 全部 題目 () 生成樹 father for <題目鏈接> 題目大意: 給你一些點的坐標,要求你將這些點全部連起來,但是必須要包含某一條特殊的邊,問你連起這些點的總最短距離是多少。 解題分析: 因為一定要包含那條邊,我們就記錄下那條邊的

區間偶數異或和好題離線樹狀陣列字首和前驅思想

【連結】 http://hznu.club/OJ/problem.php?cid=1227&pid=2 【題意】 求區間出現偶數次的數的異或和 【思路】 首先,沒有修改,可以離線查詢,減少複雜度。 其次,我們容易知道的是:區間出現奇數次的數的異或和,即為區間異或和。

HDU 3389 GameNim博弈變形階梯博弈

Bob and Alice are playing a new game. There are n boxes which have been numbered from 1 to n. Each box is either empty or contains several cards. Bob

DNA Evolution CodeForces - 828E(827C)樹狀陣列

題目連結   很難的一道題吧,算是挺難了,就是想到挺複雜,作為我這麼個Ju蒻來說。   題目給你一串字串,是初始的字串,然後告訴你一系列操作,問你: (一)、改變點Xi上的字元; (二)、查詢【l,r】區間上的對應與新給的字串匹配的個數是幾個?例如“ACGTC

hdu 1695 GCD 容斥原理

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=1695 題目大意:求(1,b)區間和(1,d)區間裡面gcd(x, y) = k的數的對數(1<=x<=b , 1<= y <= d)。 思路:讓x,y都除上k,就是求gc

歷屆試題 小朋友排隊樹狀陣列

  歷屆試題 小朋友排隊   時間限制:1.0s   記憶體限制:256.0MB 問題描述   n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。   每個小朋友都有一個不高興的程度。開始的時候,所有小朋友的不高興程度

CHOJ 4201 樓蘭圖騰樹狀陣列

描述 在完成了分配任務之後,西部314來到了樓蘭古城的西部。相傳很久以前這片土地上(比樓蘭古城還早)生活著兩個部落,一個部落崇拜尖刀(‘V’),一個部落崇拜鐵鍬(‘∧’),他們分別用V和∧的形狀來代表各自部落的圖騰。 西部314在樓蘭古城的下面發現了一幅巨大的壁畫,壁畫上被

2016 大連區域賽 現場賽 E—Aninteresting game樹狀陣列

Aninteresting game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 120    Acce