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


    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
    ", dp[k3][1]);
        }
        return 0;
    }
    

  • 相关阅读:
    WeTypecho程序配置
    XX人事系统.nsi
    query-validate 插件
    数据库操作技巧 之 oracle连表update、跨库查询、恢复被删除数据、解决锁表
    Oracle中添加银行家四舍五入
    Java生成MD5的方法,简单封装并转为32位小写
    springMVC中使用oracle批量插入的书写方法
    前端ajax能访问到后台的controller中但是前端报错404
    远程连接Oracle 数据库连接报错ORA-12638身份检索失败
    SQL state [72000]; error code [1013]; ORA-03111: 通信通道收到中断; java.sql.SQLException: ORA-01745: 无效的主机/绑定变量名;java.sql.SQLException: ORA-01013: 用户请求取消当前的操作
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/7060702.html
Copyright © 2020-2023  润新知