NYOJ 37 回文字符串

来源:互联网 发布:程序员bug表情包 编辑:程序博客网 时间:2024/05/21 05:04

给你一个字符串 然后问你 最少往里添加多少个字母让他变成回文串

由于之前做过括号匹配二 所以 看到这道题  就直接往动态规划想了   定义dp[I][j] 为I ~ j中的最大回文数量 什么的 但是想了好久也没有推出来转移方程

然后看了下别人写的 看到一句话:翻转字符串 求LCS 于长度作差 既为解  

感觉自己在写这道题的时候思维定式   想的太少了


#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#define debug() printf("GG~~\n")using namespace std;const int N = 1005;int dp[N][N];char str[N];int main(){    int t;    scanf("%d",&t);    getchar();    while (t -- ) {        char inver[N];        scanf("%s",str + 1);        int length = strlen(str + 1);        int cnt = 1;        for (int i = length ; i > 0; i --) {            inver[cnt ++] = str[i];        }        memset(dp , 0, sizeof(dp));        for (int i = 1; i <= length; i ++) {            for (int j = 1; j <= length; j ++) {                if(str[i] == inver[j])                    dp[i][j] = dp[i - 1][j - 1] + 1;                else                    dp[i][j] = max(dp[i - 1][j] , dp[i][j - 1]);            }        }        printf("%d\n",length - dp[length][length]);    }}

原创粉丝点击