题目来源于算法艺术与信息学竞赛动态规划那章。
分别运用了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 stub
for(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 stub
int 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 stub
Scanner 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]);
}
}