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; }