SYZOJ - 補充構造迴文串(動態規劃)

chw_throx發表於2022-03-09

題目連結:  


記憶體限制:128 MiB時間限制:1000 ms


題目描述

迴文串就是類似aba, bcdcb,AAA這樣的字串。即將它反轉過來,與原串相等。


另外這樣的字串,例如ab,我們可以發現,在最後補充一個a也能使它變成一個迴文串 aba,或者在他的最前面插入一個b,能使它變成一個迴文串bab


現在輸入一個字串(它很可能不是迴文串),那麼問最少給它插入多少個字元,能使它變成一個迴文串?


輸入格式

一行,一個字串


字串可能出現類似%、*等字元,保證均為可見字元。


輸出格式

一個數字,需要新增的最少字元數


如果不需要新增字元,輸出0


樣例輸入



ab




樣例輸出



1




資料範圍與提示



2 <= 字串長度 <= 200

保證輸入的字串中間不會出現空格


提示

把輸入的字串反轉過來,與原串求LCS(最長公共子序列),然後......




解題思路

求最長公共子序列。


#include <bits/stdc++.h>

using namespace std;

int dp[205][205];

char str[205];

int main() {

    int len;

    scanf("%s", str);

    len = strlen(str);

    for (int i = 1; i <= len; i++) {

        for (int j = 1; j <= len; j++) {

            if (str[i - 1] != str[len - j])

                dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);

            else dp[i][j] = dp[i - 1][j - 1] + 1;

        }

    }

    printf("%d\n", len - dp[len][len]);

    return 0;

}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22198239/viewspace-2868745/,如需轉載,請註明出處,否則將追究法律責任。

相關文章