zoukankan      html  css  js  c++  java
  • P1435 回文字串(DP)

    题目描述

    回文词是一种对称的字符串。任意给定一个字符串,通过插入若干字符,都可以变成回文词。此题的任务是,求出将给定字符串变成回文词所需要插入的最少字符数。

    比如 “Ab3bd”插入2个字符后可以变成回文词“dAb3bAd”或“Adb3bdA”,但是插入少于2个的字符无法变成回文词。

    注:此问题区分大小写

    输入输出格式

    输入格式:

    一个字符串(0<strlen<=1000)

    输出格式:

    有且只有一个整数,即最少插入字符数

    输入输出样例

    输入样例#1: 复制
    Ab3bd
    输出样例#1: 复制
    2

    题解:

    回文字符串特点:正着读和倒着读都是一样的

    既然这样是不是可以把原序列正着当作一个序列,倒着当作另一个序列,求出来他们的最长公共子序列,再减去序列长度

    感觉好像没有什么了,那就上代码吧:

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<iostream>
     4 #include<algorithm>
     5 using namespace std;
     6 int dp[1005][1005];
     7 int main()
     8 {
     9     char q[1005],w[1005];
    10     scanf("%s",q);
    11     int n=strlen(q),m=0;
    12     for(int i=n-1;i>=0;--i)
    13     {
    14         w[m++]=q[i];
    15     }
    16     for(int i=0;i<n;++i)
    17     {
    18         for(int j=0;j<n;++j)
    19         {
    20             if(q[i]==w[j] && i>0 && j>0) dp[i][j]=dp[i-1][j-1]+1;
    21             else if(q[i]==w[j] && (i<=0 || j<=0)) dp[i][j]=1;
    22             else if(i>0 && j>0 && q[i]!=w[j]) dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
    23             else if(i>0 && j<=0 && q[i]!=w[j]) dp[i][j]=dp[i-1][j];
    24             else if(i<=0 && j>0 && q[i]!=w[j]) dp[i][j]=dp[i][j-1];
    25             else dp[i][j]=0;
    26         }
    27     }
    28     printf("%d
    ",n-dp[n-1][n-1]);
    29 }
    View Code
  • 相关阅读:
    一个简单粗暴的爬虫
    Linux 目录结构
    python 部署 Restful web
    JVM 运行时数据区总结 栈 堆 堆大小配置总结
    成都法律援助申请流程
    JavaEE error整理(不断更新)
    ehcache.xml 属性大全
    SpringMVC 构建Restful风格 及问题处理
    Http Content-Type
    Redis 教程 Java工程师学习知识点
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/11026583.html
Copyright © 2011-2022 走看看