• 【动态规划】回文字符串


    【动态规划】回文字符串

    时间限制: 1 Sec  内存限制: 128 MB

    题目描述

    所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba"。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。

    输入

    第一行给出整数N(0<N<100)
    接下来的N行,每行一个字符串,每个字符串长度不超过1000.

    输出

    每行输出所需添加的最少字符数

    样例输入

    1
    Ab3bd
    

    样例输出

    2

    分析:求插入最少的字符使字符串变为回文字符串就是求输入字符串中的最大回文数长度然后用总长减去最大长度就是所求字符数
    dp[i][j]表示从输入字符串的第i个位置到第j个位置的最大长度
    if(c[i-1]==c[j-1])  dp[i][j]=dp[i-1][j-1]+1
    else  dp[i][j]=max(dp[i-1][j],dp[i][j-1]


     1 #include <iostream>
     2 #include <cstring>
     3 #include <algorithm>
     4 
     5 using namespace std;
     6 
     7 int n;
     8 char c[1111],d[1111];
     9 int dp[1111][1111];
    10 
    11 int main()
    12 {
    13     while(cin>>n)
    14     {
    15         while(n--)
    16         {
    17             cin>>c;
    18             int len=strlen(c);
    19             memset(dp,0,sizeof(dp));
    20             for(int i=0,j=len-1;i<len;i++,j--)
    21                 d[j]=c[i];
    22 
    23             for(int i=1;i<=len;i++)                 //dp[i][j]需要从0开始
    24             {
    25                 for(int j=1;j<=len;j++)             
    26                 {
    27                     if(c[i-1]==d[j-1])              //c[i-1]  d[j-1]从0到len-1
    28                         dp[i][j]=dp[i-1][j-1]+1;
    29                     else
    30                         dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
    31                 }
    32             }
    33             cout<<len-dp[len][len]<<endl;
    34         }
    35     }
    36     return 0;
    37 }
     
  • 相关阅读:
    6月23号 java方法 什么是方法?
    6月21号 Java流程控制 练习
    6月21号 Java流程控制 break continue
    6月21号 Java流程控制 增强for
    6月19号 Java流程控制 循环结构for练习
    6月18号 Java流程控制 循环结构for
    qbot
    clion 2019.2
    raptor
    字符串练习
  • 原文地址:https://www.cnblogs.com/asuml/p/5726769.html
Copyright © 2020-2023  润新知