PKU演習問メモ(6/27)
No. | 問題名 | 問題の種類および解法 | 難易度 |
---|---|---|---|
2955 | Brackets | 動的計画法 | ★★☆☆☆ |
2955 Brackets
問題概要
"regular brakets"とは、括弧の対応が正しい文字列をいう。
(), [], (()), ()[], ()[()]は"regular brakets"であるが、 (, ], )(, ([)], ([(]はそうではない。
100文字以下の'(',')','[',']'からなる文字列が与えられた時、
この文字列の部分文字列で(連続する部分とは限らない)最長の"regular brakets"の長さを求めよ。
解法
数週間悩んだorz
NisokuのDP版と全く同じ解法で解けるじゃないかorz
dp[s][t]にsからt文字目までの最長のregularな文字列の長さを持ち、メモ化探索をすればよい。
ソースコード
int len; string str; int dp[101][101]; int rec(int s,int t) { if(s>=t)return 0; int &ret=dp[s][t]; if(ret>=0)return ret; ret=0; for(;s<t;s++)for(int i=s;i<t;i++) { if(str[s]=='('&&str[i]==')')ret=max(ret,2+rec(s+1,i)+rec(i+1,t)); if(str[s]=='['&&str[i]==']')ret=max(ret,2+rec(s+1,i)+rec(i+1,t)); } return ret; } int main() { while(cin>>str,str!="end") { len=str.size(); rep(i,1+len)fill_n(dp[i],1+len,-1); cout<<rec(0,len)<<endl; } return 0; }