1141Brackets Sequence

真的是一道好题,不仅仅在dp[i][j]的表示上,还是在输出上pos上的确认上

之前有一个错误,不过后来改了,就ACCEPT了

work();
print(1,n);
cout<<endl;就缺了最后的cout<<endl;坑爹啊,就这个小细节

#include "iostream"
#include "string.h"
#define MAXN 120
#define INF 100000
using namespace std;
int f[MAXN][MAXN],pos[MAXN][MAXN];
int n;
char list[200];

void work(){
  int i,v,j,k,tem;
  memset(f,0,sizeof(f));
  for(i=n;i>=1;i--){
    list[i]=list[i-1];
    f[i][i]=1;
  }
  for(v=1;v<n;v++){
    for(i=1;i<=n-v;i++){
      j=v+i;
      f[i][j]=INF;
      if(list[i]=='('&&list[j]==')'||(list[i]=='['&&list[j]==']')){
        f[i][j]=f[i+1][j-1];
      }
      pos[i][j]=-1;
      for(k=i;k<j;k++){
        tem=f[i][k]+f[k+1][j];
        if(f[i][j]>tem){
          f[i][j]=tem;
          pos[i][j]=k;
        }
      }
    }
  }
}

void print(int s,int e){
  if(s>e)return;
  else{
    if(s==e){
      if(list[s]=='('||list[s]==')')cout<<"()";
      else cout<<"[]";
    }
    else {
      if(pos[s][e]==-1){
        if(list[s]=='('){
              cout<<'(';
              print(s+1,e-1);
              cout<<')';
           }
        else{
          cout<<'[';
          print(s+1,e-1);
          cout<<']';
        }
      }
      else {
        print(s,pos[s][e]);
        print(pos[s][e]+1,e);
      }
    }
  }
}
int main(){
  cin>>list;
  n=strlen(list);
  work();
  print(1,n);
  cout<<endl;
}

 

 

posted @ 2013-09-12 10:26  龙城星  阅读(185)  评论(0编辑  收藏  举报