Light OJ 1033 - Generating Palindromes

来源:互联网 发布:php文章分页 编辑:程序博客网 时间:2024/04/29 08:16

题目大意:

给你一个字符串,问最少添加多少个字符,使原字符串变成回文串

思路:

回文串的性质是倒过来两者一样, 那么有这个性质可知, 设原始字符串为a,原始字符串颠倒过来的字符串为b,  那么求a和b的最长公共子序列, 字符串a的长度减去最长公共自序列的长度不就是最少添加的字符!

代码如下:

#include <bits/stdc++.h>using namespace std;typedef long long ll;const ll N = 107;char a[N], b[N];int dp[N][N];void solve(){    scanf(" %s",a);    int len = (int)strlen(a);    for(int i=0; i<len; i++)        b[len-1-i] = a[i];    memset(dp, 0, sizeof(dp));    for(int i=0; i<len; ++i)    {        for(int j=0; j<len; ++j)        {            if(a[i] == b[j])                dp[i+1][j+1] = dp[i][j] + 1;            else                dp[i+1][j+1] = max(dp[i][j+1], dp[i+1][j]);        }    }    printf("%d\n",len - dp[len][len]);}int main(){    int T;    scanf("%d",&T);    for(int i=1; i<=T; i++)    {        printf("Case %d: ", i);        solve();    }    return 0;}


0 0
原创粉丝点击