hdu 1513

題意:給你一個長度爲n的字符串,求出最少加多少字符才能使成爲迴文串。

我們可以把str1倒過來,得到str2。那麼str1和str2的Lcs就是他們之間的最大不需要修改的值。也就是說,那些值原本是不需要動的。只是因爲缺少一些必要的字符,只要加上他們str1就和str2相等了。n - LCS的長度,就是缺少的必要字符的值,就是答案。



#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 5000 + 5;
long long d[3][maxn];
char str[maxn];
int main()
{
    int n;
    while(scanf("%d", &n) == 1)
    {
        memset(d, 0, sizeof(d));
        scanf("%s", str);
        int temp;
        for(int i = 0; i < n; i++)
        {
            temp = i & 1;
            for(int j = 0; j < n; j++)
            {
                if(str[i] == str[n - j - 1]) d[temp][j + 1] = d[temp^1][j] + 1;
                else d[temp][j + 1] = max(d[temp][j], d[temp^1][j + 1]);
            }
        }
        printf("%lld\n", n - d[temp][n]);
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章