这是道让我找手感的题,挺长时间没做DP了,先来个简单的。 括号序列,是个人都听说过的题…比较水… program brackets_sequence; var f:array[0..101,0..101] of string; vis:array[0..101,0..101] of boolean; s:string; i,len:longint; function min(s,t:string):string; begin if t='@' then exit(s); if length(t)>=length(s) then exit(s) else exit(t); end; function dp(l,r:longint):string; var k:longint; begin if vis[l,r] then exit(f[l,r]); vis[l,r]:=true; f[l,r]:='@'; if (s[l]='(') and (s[r]=')') then f[l,r]:=min('('+dp(l+1,r-1)+')',f[l,r]) else if (s[l]='[') and (s[r]=']') then f[l,r]:=min('['+dp(l+1,r-1)+']',f[l,r]) else begin if s[l]='(' then f[l,r]:=min('('+dp(l+1,r)+')',f[l,r]); if s[l]='[' then f[l,r]:=min('['+dp(l+1,r)+']',f[l,r]); if s[r]=')' then f[l,r]:=min('('+dp(l,r-1)+')',f[l,r]); if s[r]=']' then f[l,r]:=min('['+dp(l,r-1)+']',f[l,r]); end; for k:=l to r-1 do f[l,r]:=min(dp(l,k)+dp(k+1,r),f[l,r]); exit(f[l,r]); end; begin assign(input,'a.in'); reset(input); assign(output,'a.out'); rewrite(output); readln(s); fillchar(vis,sizeof(vis),0); len:=length(s); for i:=1 to len+1 do begin f[i,i-1]:=''; vis[i,i-1]:=true; end; f[1,len]:=dp(1,len); writeln(f[1,len]); close(input); close(output); end.