• LCS+滚动数组(DP问题)


    POJ 1159题意:        回文词是一种对称的字符串。任意给定一个字符串,通过插入若干字符,都可以变成回文词。现在的任务是,求出将给定字符串变成回文词所需要插入的最少字符数。比如:“Ab3bd”插入2个字符后可以变成回文词“dAb3bAd”或“Adb3bdA”,但是插入少于2个的字符无法变成回文词。
    [输入]: 第一行:字符串的长度N(3 <= N <= 5000) 第二行:需变成回文词的字符串 [输出]:   将给定字符串变成回文词所需要插入的最少字符数
    [样例]: Sample Input   5   Ab3bd
      Sample Output   2
    分析: S和S'   (注:S'是S的反串)的最长公共子串其实一定是回文的。这样我们就可以借助lcs来解决该题,即用s的长度减去lcs的值即可。

    import java.io.BufferedReader;   
    import java.io.InputStreamReader;   
      
    public class Main {   
      
     public static void main(String[] args) throws Exception{   
        BufferedReader in = new BufferedReader(new InputStreamReader (System.in));   
        int total = Integer.parseInt(in.readLine());   
        String string = in.readLine();   
            System.out.println(total-LCS(string,new StringBuffer(string).reverse().toString()));   
    }   
      
    //返回两个string的lcs的长度   
    public static int LCS(String str1,String str2){   
        short length1 = (short)str1.length();   
        short length2 = (short)str2.length();   
        short[][]result = new short [2][length2+1];   //滚动数组,节省空间只依赖于前面的两个解    
        for(int i=1;i<=length1;i++){   
          for(int j=1;j<=length2;j++){   
            if(str1.charAt(i-1)==str2.charAt(j-1))   
             result[i%2][j] = (short)(result[(i-1)%2][j-1]+1);   
            else  
             result[i%2][j] = result[(i-1)%2][j]>result[i%2][j-1]?result[(i-1)%2][j]:result[i%2][j-1];   
            }   
        }   
        return result[length1%2][length2];   
     }   
           
      
    }  
    
  • 相关阅读:
    C语言基于单链表得学生成绩管理系统
    C语言实现扫雷小程序外挂,棒棒的
    小白学习C语言一定要掌握的那些知识点!
    C语言快速入门教程之10分钟快速掌握数据类型
    神奇的C语言,这才是C语言大牛操作,作为面试题,怕是秒杀众人
    多线程
    java基础- Collection和map
    String 和 new String
    idea快捷键
    用bootstrap 分页插件问题
  • 原文地址:https://www.cnblogs.com/xiaoying1245970347/p/3171227.html
Copyright © 2020-2023  润新知