zoukankan      html  css  js  c++  java
  • 51Nod

    51Nod - 1092 回文字符串

    回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。每个字符串都可以通过向中间添加一些字符,使之变为回文字符串。
    例如:abbc 添加2个字符可以变为 acbbca,也可以添加3个变为 abbcbba。方案1只需要添加2个字符,是所有方案中添加字符数量最少的。
     
    Input
    输入一个字符串Str,Str的长度 <= 1000。
    Output
    输出最少添加多少个字符可以使之变为回文字串。
    Input示例
    abbc
    Output示例
    2

    题解:

       添加的字符串,是来匹配那些孤单的字符,同时,那些匹配成功的字符就不需要添加字符了。 

      所以, 找到原字符串中的 已经匹配成功的字符串就不需要。 (匹配成功的,其实是 其本身与反身的最长公共子字符序列。)

      求反操作: len - max( 匹配成功的字符 )

    #include <iostream>  
    #include <cstdlib> 
    #include <cstring> 
    #include <cstdio> 
    using namespace std;
    const int MAXN = 1000 + 10; 
    
    int len, ans, dp[MAXN][MAXN];  
    char st[MAXN], rest[MAXN]; 
    
    int main(){ 
        
    	scanf("%s", st+1); 
    
    	len = strlen(st+1); 
    	for(int i=1; i<=len; ++i){
    		rest[len-i+1] = st[i]; 
    	}
    	
    	memset(dp, 0, sizeof(dp)); 
    	for(int i=1; i<=len; ++i){
    		for(int j=1; j<=len; ++j){
    			dp[i][j] = max(dp[i][j-1], dp[i-1][j]); 
    			if( rest[i] == st[j] ){
    				dp[i][j] = max( dp[i][j], dp[i-1][j-1] + 1 ); 
    			}else{
    				dp[i][j] = max( dp[i][j], dp[i-1][j-1] ); 
    			}
    		}
    	}
    
    	ans = len - dp[len][len]; 
    	printf("%d
    ", ans ); 
    	return 0; 
    }
    

      

  • 相关阅读:
    Linux系统主流架构一
    CentOS7.2部署KVM虚拟机
    MySQL
    MQ消息队列
    LVM
    Docker管理工具-Swarm部署记录
    Linux下DNS简单部署(主从域名服务器)
    kvm虚拟机命令梳理
    批量创建10个系统帐号tianda01-tianda10并设置密码
    随笔分类
  • 原文地址:https://www.cnblogs.com/zhang-yd/p/6883126.html
Copyright © 2011-2022 走看看