poj1141 Brackets Sequence
黑书上的第一种优化
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<algorithm> char map[120]; struct T { char str[220]; int len;//字符串的长度 int num;//所加字符的数目 }res[120][120]; bool flag[120][120]; void digui(int l,int r) { char temp; int i; if(l==r) { if(map[l]=='('||map[l]==')') { res[l][r].len=2; res[l][r].num=1; res[l][r].str[0]='('; res[l][r].str[1]=')'; res[l][r].str[2]='\0'; } if(map[r]=='['||map[r]==']') { res[l][r].len=2; res[l][r].num=1; res[l][r].str[0]='['; res[l][r].str[1]=']'; res[l][r].str[2]='\0'; } flag[l][r]=true; return; } if((map[l]=='('&&map[r]==')')||(map[l]=='['&&map[r]==']')) { if(r+1<l-1) { res[l][r].len=2; res[l][r].str[0]=map[l]; res[l][r].str[1]=map[r]; res[l][r].num=0; res[l][r].str[2]='\0'; } else { if(flag[l+1][r-1]==false) { digui(l+1,r-1); } if(res[l][r].num==-1||res[l][r].num>res[l+1][r-1].num) { res[l][r].len=0; res[l][r].num=res[l+1][r-1].num; res[l][r].str[res[l][r].len++]=map[l]; for(i=0;i<res[l+1][r-1].len;i++) { res[l][r].str[res[l][r].len++]=res[l+1][r-1].str[i]; } res[l][r].str[res[l][r].len++]=map[r]; res[l][r].str[res[l][r].len]='\0'; } } } else { if(map[l]=='('||map[l]=='[') { if(!flag[l+1][r]) { digui(l+1,r); } if(res[l][r].num==-1||res[l][r].num>res[l+1][r].num+1) { res[l][r].len=0; res[l][r].str[res[l][r].len++]=map[l]; for(i=0;i<res[l+1][r].len;i++) { res[l][r].str[res[l][r].len++]=res[l+1][r].str[i]; } temp=(map[l]=='('?')':']'); res[l][r].str[res[l][r].len++]=temp; res[l][r].str[res[l][r].len]='\0'; } } if(map[r]==')'||map[r]==']') { if(!flag[l][r-1]) { digui(l,r-1); } if(res[l][r].num==-1||res[l][r].num>res[l][r-1].num+1) { res[l][r].len=0; temp=(map[r]==')'?'(':'['); for(i=0;i<res[l][r-1].len;i++) { res[l][r].str[res[l][r].len++]=res[l][r-1].str[i]; } res[l][r].str[res[l][r].len++]=temp; res[l][r].str[res[l][r].len]='\0'; } } } for(i=l;i<=r-1;i++) { if(!flag[l][i]) { digui(l,i); } if(!flag[i+1][r]) { digui(i+1,r); } if(res[l][r].num==-1||res[l][r].num>res[l][i].num+res[i+1][r].num) { res[l][r].num=res[l][i].num+res[i+1][r].num; strcpy(res[l][r].str,res[l][i].str); strcat(res[l][r].str,res[i+1][r].str); res[l][r].len=strlen(res[l][r].str); } } flag[l][r]=true; } void init(int l) { int i,j; for(i=0;i<l;i++) { for(j=i;j<l;j++) { res[i][j].len=0; res[i][j].num=-1; flag[i][j]=false; } } } int main() { while(gets(map)) { int l=strlen(map); init(l); if(l==0) { printf("\n"); continue; } digui(0,l-1); printf("%s\n",res[0][l-1].str); } return 0; } //1704K 47MS
黑书上的第二种优化
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<algorithm> char map[120]; struct T { char str[220]; int len;//字符串的长度 int num;//所加字符的数目 }res[120][120]; void digui(int l,int r) { char temp; int i; if(l==r) { if(map[l]=='('||map[l]==')') { res[l][r].len=2; res[l][r].num=1; res[l][r].str[0]='('; res[l][r].str[1]=')'; res[l][r].str[2]='\0'; } if(map[r]=='['||map[r]==']') { res[l][r].len=2; res[l][r].num=1; res[l][r].str[0]='['; res[l][r].str[1]=']'; res[l][r].str[2]='\0'; } return; } if((map[l]=='('&&map[r]==')')||(map[l]=='['&&map[r]==']')) { if(r+1<l-1) { res[l][r].len=2; res[l][r].str[0]=map[l]; res[l][r].str[1]=map[r]; res[l][r].num=0; res[l][r].str[2]='\0'; } else { if(res[l][r].num==-1||res[l][r].num>res[l+1][r-1].num) { res[l][r].len=0; res[l][r].num=res[l+1][r-1].num; res[l][r].str[res[l][r].len++]=map[l]; for(i=0;i<res[l+1][r-1].len;i++) { res[l][r].str[res[l][r].len++]=res[l+1][r-1].str[i]; } res[l][r].str[res[l][r].len++]=map[r]; res[l][r].str[res[l][r].len]='\0'; } } } else { if(map[l]=='('||map[l]=='[') { if(res[l][r].num==-1||res[l][r].num>res[l+1][r].num+1) { res[l][r].len=0; res[l][r].str[res[l][r].len++]=map[l]; for(i=0;i<res[l+1][r].len;i++) { res[l][r].str[res[l][r].len++]=res[l+1][r].str[i]; } temp=(map[l]=='('?')':']'); res[l][r].str[res[l][r].len++]=temp; res[l][r].str[res[l][r].len]='\0'; } } if(map[r]==')'||map[r]==']') { if(res[l][r].num==-1||res[l][r].num>res[l][r-1].num+1) { res[l][r].len=0; temp=(map[r]==')'?'(':'['); for(i=0;i<res[l][r-1].len;i++) { res[l][r].str[res[l][r].len++]=res[l][r-1].str[i]; } res[l][r].str[res[l][r].len++]=temp; res[l][r].str[res[l][r].len]='\0'; } } } for(i=l;i<=r-1;i++) { if(res[l][r].num==-1||res[l][r].num>res[l][i].num+res[i+1][r].num) { res[l][r].num=res[l][i].num+res[i+1][r].num; strcpy(res[l][r].str,res[l][i].str); strcat(res[l][r].str,res[i+1][r].str); res[l][r].len=strlen(res[l][r].str); } } } void make(int l) { int i,j; for(i=0;i<l;i++) { res[i][i].len=2; res[i][i].num=1; if(map[i]=='('||map[i]==')') { res[i][i].str[0]='('; res[i][i].str[1]=')'; res[i][i].str[2]='\0'; } if(map[i]=='['||map[i]==']') { res[i][i].str[0]='['; res[i][i].str[1]=']'; res[i][i].str[2]='\0'; } } for(i=l-2;i>=0;i--) { for(j=i+1;j<l;j++) { digui(i,j); } } } void init(int l) { int i,j; for(i=0;i<l;i++) { for(j=i;j<l;j++) { res[i][j].len=0; res[i][j].num=-1; } } } int main() { while(gets(map)) { int l=strlen(map); init(l); if(l==0) { printf("\n"); continue; } //digui(0,l-1); make(l); printf("%s\n",res[0][l-1].str); } return 0; } //1688K 79MS