nyoj 15 括號匹配(二)
阿新 • • 發佈:2019-02-12
#include<cstdio> #include<iostream> #include<string.h> using namespace std; int dp[105][105]; char s[105]; #define INF 111111111 int fun(int len) { int i,p,j,k; memset(dp,0,sizeof(dp)); for(i=0;i<len;i++) dp[i][i]=1;// 本身自己要匹配,值為1. for(p=1;p<len;p++) for(i=0;i<len-p;i++) { j=i+p;dp[i][j]=INF; //i和j分別代表的是s[i]到s[j]的長度要匹配的最少數存在dp[i][j]中。 if(s[i]=='('&&s[j]==')'||s[i]=='['&&s[j]==']') dp[i][j]=dp[i+1][j-1]; //s[i]和s[j]是匹配的,它與s[i+1]到s[j]的長度匹配度是相同的。 else if(s[i]=='('||s[i]=='[') dp[i][j]=dp[i+1][j]+1; //兩個else if的i和j調換不影響結果 //s[i]到s[j]不匹配,s[i]為左括號,則它要的值是s[i+1]到s[j]的最少匹配是dp[i+1][j]+1; else if(s[j]==')'||s[j]==']') dp[i][j]=dp[i][j-1]+1; //s[i]到s[j]不匹配,s[j]為右括號,則它要的值是s[i]到s[j-1]的最少匹配是dp[i][j-1]+1; for(k=i;k<j;k++) dp[i][j]=min(dp[i][j],dp[k+1][j]+dp[i][k]); //分成兩個子串,求s[i]到s[j]的最優解。 } return dp[0][len-1]; } int main() { int T; cin>>T; while(T--) { cin>>s; int len=strlen(s); printf("%d\n",fun(len)); } return 0; }