GDUT决赛 - Problem B: 完美串(DP`LCS)

题目;

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

2410013111

Sample Output

23

思路:

因为0,1可以随意插入,所以按照题目取反翻转之后,求出与原来字符串最少有多少个字母不同,转化为求最长公共子序列.

AC.

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;
char s[1005];
int a[1005], b[1005];
int dp[1005][1005];

int main()
{
//freopen("in", "r", stdin);
    int T;
    scanf("%d", &T);
    while(T--) {
        int n;
        scanf("%d", &n);
        scanf("%s", s);
        int k = n-1;
        for(int i = 0; i < n; ++i) {
            a[i] = s[i]-'0';
            b[k--] = 1-a[i];
        }
        memset(dp, 0, sizeof(dp));

        for(int i = 0; i < n; ++i) {
            for(int j = 0; j < n; ++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", dp[n][n]);
        printf("%d\n", n-dp[n][n]);
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值