1159--Palindrome(dp:回文串变形2)

本文深入探讨了深度学习技术在音视频处理领域的应用,涵盖了从图像处理到AR特效,再到AI音视频处理等多个方面,展示了深度学习如何通过神经网络实现复杂任务的自动化处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Palindrome
Time Limit: 3000MS Memory Limit: 65536K
Total Submissions: 53431 Accepted: 18454

Description

A palindrome is a symmetrical string, that is, a string read identically from left to right as well as from right to left. You are to write a program which, given a string, determines the minimal number of characters to be inserted into the string in order to obtain a palindrome. 

As an example, by inserting 2 characters, the string "Ab3bd" can be transformed into a palindrome ("dAb3bAd" or "Adb3bdA"). However, inserting fewer than 2 characters does not produce a palindrome. 

Input

Your program is to read from standard input. The first line contains one integer: the length of the input string N, 3 <= N <= 5000. The second line contains one string with length N. The string is formed from uppercase letters from 'A' to 'Z', lowercase letters from 'a' to 'z' and digits from '0' to '9'. Uppercase and lowercase letters are to be considered distinct.

Output

Your program is to write to standard output. The first line contains one integer, which is the desired minimal number.

Sample Input

5
Ab3bd

Sample Output

2

Source

IOI 2000
另一种dp的方法,dp[l][i],表示长度为l的以第i个字符开始的字符串需要多少操作。
对于长度为1的字符串,操作为0
长度为2的字符串,如果两个字符相同,操作为0,不同操作为1
长度为3的字符串,如果左右相同,操作为0,左右不同,对于a[1],a[2],a[3]来说 可以在前面增加a[3],或后面增加a[1],那么就只需要判断剩余的两和字符需要的操作了。
长度为4的字符串,左右相同,那么需要求中间的两个字符,不同的话和长度为3的判断方式相同。
得到 长度为l开始为i的串可以由, 长度为l-1开始为i的,长度为l-1开始为i+1的,或者是长度为l-2,开始为i+1的变化得到。推出dp公式
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int dp[3][5100] ;
char str[5100] ;
int main()
{
    int i , l , k1 , k2 , k3 , n ;
    while(scanf("%d", &n) !=EOF)
    {
        scanf("%s", str);
        for(i = n ; i >= 0 ; i--)
            str[i] = str[i-1] ;
        k1 = -1 ; k2 = 0 ; k3 = 1;
        memset(dp,0,sizeof(dp));
        for(l = 2 ; l <= n ; l++)
        {
            k3++ ;
            if(k3 == 3) k3 = 0 ;
            if(k3 == 0){ k2 = 2 ; k1 = 1 ; }
            else if( k3 == 1 ){ k2 = 0 ; k1 = 2 ; }
            else { k2 = 1 ; k1 = 0 ; }
            for(i = 1 ; i <= n-l+1 ; i++)
            {
                if( str[i] == str[i+l-1] )
                    dp[k3][i] = min( min(dp[k2][i]+1,dp[k2][i+1]+1),dp[k1][i+1] ) ;
                else
                    dp[k3][i] = min( dp[k2][i]+1 , dp[k2][i+1]+1);
            }
        }
        printf("%d\n", dp[k3][1]);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值