动态规划:最长子序列问题
2016-05-22 16:12
162 查看
提到最长子序列问题,一下子就能想到动态规划。
衍生题目:添加最少字符使得原字符串变成回文字符串。例题见:nyoj 37.
直接上代码:
衍生题目:添加最少字符使得原字符串变成回文字符串。例题见:nyoj 37.
直接上代码:
<span style="font-size:24px;">import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); while (N-- > 0) { String str1 = sc.next(); // String str2=sc.next(); StringBuffer sb = new StringBuffer(str1); String str2 = sb.reverse().toString(); int length1 = longest(str1, str2); System.out.println(str1.length() - length1); // System.out.println(length1); } } public static int longest(String str1, String str2) { char[] s1 = str1.toCharArray(); // char[] s2=new StringBuffer(s).reverse().toString().toCharArray(); char[] s2 = str2.toCharArray(); int m = s1.length; int n = s2.length; int[][] dp = new int[m] ; dp[0][0] = s1[0] == s2[0] ? 1 : 0; for (int i = 1; i < n; i++) { dp[0][i] = Math.max(dp[0][i - 1], s1[0] == s2[i] ? 1 : 0); } for (int i = 1; i < m; i++) { dp[i][0] = Math.max(dp[i - 1][0], s1[i] == s2[0] ? 1 : 0); } for (int i = 1; i < m; i++) { for (int j = 1; j < n; j++) { if (s1[i] == s2[j]) dp[i][j] = dp[i - 1][j - 1] + 1; else dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]); } } return dp[m - 1][n - 1]; } } </span>
相关文章推荐
- SERVLETJSP学习(九)—— EL、JSTL
- map与vector---Email Aliases
- ssl例五
- 使用.net实现邮件发送
- Java 数据结构之数组的操作一:初级
- 子集生成
- Netbeans opencv 安装
- Servlet的生命周期
- 响铃:主打拍照的手机厂商们,换机时代能否自救?
- 写一简单kernel心得
- java 继承练习题3
- Sql Server 中锁的概念
- 浅析Frambuffer
- static,静态关键字的详解
- 写在最前面
- C语言宏操作之反复斟酌
- MSSQL 查询表空间
- hrbust oj 1526+2028 树状数组
- unity 定义回调函数
- Xlint以及Java Lint 选项