• 完美串(区间dp)


    完美串

    Description

    爱美之心人皆有之,GG也不例外。所以GG他对于完美串有一种热衷的爱。在GG眼中完美串是一个具有无比魅力的01子串。这个子串有之其魅力之处,对它取反后水平翻转,它又和它原来的一模一样。这就是GG热爱它的原因。但是世上并不是所有的01串都是完美串,所以GG下定决心想改造01串,使所有的01串都成为完美串。但是改造01串是一个巨大的工程,GG太忙了,他还差T个01串未改造,他需要你的帮助。而你只需要告诉它至少添加几个'0','1'字符就可以使得01串成为完美串。

    Input

    有T组数据输入。(T<=100)  每组数据只有两行,第一行一个正整数n(1<=n<=1000),接下来一行是一个01字符串,长度为n。 
      

    Output

    对于每组数据输出一行结果

    Sample Input

    2
    4
    1001
    3
    111

    Sample Output

    2
    3

    HINT

    一开始思路错了,一直再考虑1,0怎么搭配 ,(题目问你至少还要填几个 , 我转变成 : 已知一个1 ,0串 , 只要求得现在串中存在的  “最多配对数” (1 , 0 配对 或 0 , 1配对) , 但我这么做必须假定串种只有 1 , 0 (或 0 , 1)形式的配对 , 后来找到了反例 , 001011 ,orz)
    看别人的题解是对 怎样来让 “插入数 的 数量”  最小来考虑的 :

    一个数时 :必须插入一个数 , 才能形成完美串;

    两个数时 : 若a[i] != a[j] 不等不用插入 ,所以 [i , j] = [i + 1 , j - 1] ; 若相等 ,[i , j] = min ([i + 1 , j] + 1 , [i , j - 1] + 1) , 其实就是说 比上一级多了一个元素 , 一个元素 只要再 插入 一个数 就行了

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<algorithm>
     4 using namespace std;
     5 const int M = 1000 + 10 ;
     6 int T , n ;
     7 bool a[M] ;
     8 char st[M] ;
     9 int dp[M][M] ;
    10 
    11 int main ()
    12 {
    13    // freopen ("a.txt" , "r" , stdin ) ;
    14     scanf ("%d" , &T) ;
    15     while (T--) {
    16         scanf ("%d" , &n ) ;
    17         scanf ("%s" , st ) ;
    18         for (int i = 0 ; i < n ; i++) {
    19             a[i] = st[i] - '0' ;
    20         }
    21         memset (dp , 0 , sizeof (dp) ) ;
    22         for (int i = 0 ; i < n ; i++) {
    23             dp[i][i] = 1 ;//只有一个数时,必须要插入 1 个数(才能形成完美串)
    24         }
    25         for (int i = n - 1 ; i >= 0 ; i-- ) {
    26             for (int j = i + 1 ; j < n ; j++ ) {
    27                 if (a[i] != a[j]) {
    28                     dp[i][j] = dp[i + 1][j - 1]  ; //此时符合法则,可把区间插入数[i , j] = [i + 1 , j - 1]
    29                 }
    30                 else {//虽然不符合法则,但只要dp[i][j]只比上一级dp[i + 1][j] 和 dp[i][j = 1]多插入一个元素 , 一个元素 只要 再插入一个数即可
    31                     dp[i][j] = min (dp[i][j - 1] + 1 , dp[i + 1][j] + 1 ) ;
    32                 }
    33             }
    34         }
    35         printf ("%d
    " , dp[0][n - 1] ) ;
    36     }
    37     return 0 ;
    38 }
    428ms
  • 相关阅读:
    来自CSDN的精华网址
    图片及生成缩略图
    那位对DataGrid控熟悉?能否请教一下
    关于用.NET写邮件发送系统的问题
    JavaScript]几种常用的表单输入判断
    VB C# 语法对比图
    给上传的图片加上一个水印
    那位对DataGrid控熟悉?能否请教一下
    一句话木马的免杀(转)
    SOAP注入攻击详解(转)
  • 原文地址:https://www.cnblogs.com/get-an-AC-everyday/p/4351742.html
Copyright © 2020-2023  润新知