[C - Brackets] 區間dp
阿新 • • 發佈:2020-07-09
C - Brackets 區間dp
題目大意:
給你長度為n的序列,問1~n的最長合法子序列是多長。
題解:
對於一個括號的匹配,有兩種方法
- 合法括號的巢狀
- 合法括號的排列
如果是第一種轉移方程是:\(dp[i][j]=dp[i+1][j-1]+2\)
如果是第二種轉移方程是:\(dp[i][j]=dp[i][x]+dp[x+1][j]\)
#include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> #define id first #define val second #define inf 0x3f3f3f3f #define inf64 0x3f3f3f3f3f3f3f3f #define debug(x) printf("debug:%s=%d\n",#x,x); //#define debug(x) cout << #x << ": " << x << endl using namespace std; typedef long long ll; const int maxn=110; int dp[maxn][maxn]; char s[maxn]; int main(){ while(scanf("%s",s+1)&&s[1]!='e'){ int n = strlen(s+1); for(int i=0;i<=n;i++){ for(int j=0;j<=n;j++) dp[i][j]=0; } for(int len=2;len<=n;len++){ for(int i=1;i+len-1<=n;i++){ int j=i+len-1; for(int k=i;k<=j;k++){ if((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']')) dp[i][j]=max(dp[i][j],dp[i+1][j-1]+2); dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]); } } } printf("%d\n",dp[1][n]); } return 0; }