动态规划 括号匹配

来源:互联网 发布:淘宝如何注销实名认证 编辑:程序博客网 时间:2024/05/22 00:18

题目来源于算法艺术与信息学竞赛动态规划那章。

分别运用了2种形式来解决这题。

package com.bluecup.org;import java.util.Arrays;import java.util.Scanner;public class DaiTai {static int f[][]=new int[20][20];/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubfor(int i=0;i<20;i++)for(int j=0;j<20;j++){f[i][j]=-1;}Scanner scanner=new Scanner(System.in);String str=scanner.nextLine();System.out.println(digui(str,0,str.length()-1));}private static int digui(String str, int i, int j) {// TODO Auto-generated method stubint answer=Integer.MAX_VALUE;if(f[i][j]!=-1)return f[i][j];if(i>j){return 0;}if(i==j)return 1;String strs=str.charAt(i)+""+str.charAt(j);if(strs.equals("()")||strs.equals("[]")){answer=Math.min(answer, digui(str,i+1,j-1));}else if(str.charAt(i)=='['||str.charAt(i)=='('){answer=Math.min(answer,digui(str,i+1,j)+1);}else if(str.charAt(j)==']'||str.charAt(j)==')'){answer=Math.min(answer ,digui(str,i,j-1)+1);}for(int index=i;index<j;index++){answer=Math.min(answer, digui(str,i,index)+digui(str,index+1,j));}f[i][j]=answer;return answer;}}


 

package com.bluecup.org;import java.util.Scanner;public class BracketsSequence {static int f[][]=new int[20][20];public static void main(String[] args) {// TODO Auto-generated method stubScanner scanner=new Scanner(System.in);String str=scanner.nextLine();char c[]=str.toCharArray();int n=str.length();    for(int i=0;i<n;i++)    {    f[i][i]=1;    }for(int l=1;l<n;l++){for(int i=0;i<n-l;i++){int k=i+l;if(k-1==i){f[i][k]=2;if(c[i]==c[k])f[i][k]=0;continue;}f[i][k]=f[i][k-1]+1;if(c[i]==c[k])f[i][k]=f[i+1][k-1];for(int j=i+1;j<k-1;j++)//比如1-5,最后应该求1-3+4+5{if(f[i][j]+f[j+1][k]<f[i][k])f[i][k]=f[i][j]+f[j+1][k];}}}System.out.println(f[0][n-1]+" "+f[0][1]);}}


 

 

 

0 0