poj 2955 Brackets 区间DP
2016-08-16 23:00
429 查看
传送门:poj 2955 Brackets
这个dp[i][j]有两个状态专一的过程,
1. 如果i位置和j位置的括号是匹配的那么,转移方程就变为了dp[i+1][j-1]
2. 然后我们将这个区间拆分为两个区间,然后我们从小到大枚举i到j这个区间,每次更新dp[i][j],所以这个状态转移方程为:dp[i][j] = max(dp[i][j],dp[j][f]+dp[f+1][j]);
题目大意
判断给定的字符串满足条件的个数,(由’[‘,’]’,’(‘.’)’构成的序列)解题思路
dp[i][j]表示i到j这个区间的最大匹配数目!这个dp[i][j]有两个状态专一的过程,
1. 如果i位置和j位置的括号是匹配的那么,转移方程就变为了dp[i+1][j-1]
2. 然后我们将这个区间拆分为两个区间,然后我们从小到大枚举i到j这个区间,每次更新dp[i][j],所以这个状态转移方程为:dp[i][j] = max(dp[i][j],dp[j][f]+dp[f+1][j]);
AC代码
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int MAXN = 105; const int INF = 0x3f3f3f3f; int dp[MAXN][MAXN]; int main() { char str[MAXN]; while(~scanf("%s",str)) { if(!strcmp(str,"end"))break; memset(dp,0,sizeof dp); int n = strlen(str); for(int i=1;i<n;i++){ //枚举区间长度 for(int j=0,k=i;k<n;k++,j++){ //根据这个区间长度,一直遍历到最后结束 if((str[j]=='['&&str[k]==']')||(str[j]=='('&&str[k]==')')) //第一个状态转移 dp[j][k] = dp[j+1][k-1]+2; for(int f=j;f<k;f++) //枚举区间中的括号,每次更新dp[i][j] dp[j][k] = max(dp[j][k],dp[j][f]+dp[f+1][k]);//第二个状态转移 } } printf("%d\n",dp[0][n-1]); } return 0; }
相关文章推荐
- POJ 2955 Brackets (区间DP)
- POJ 2955 Brackets (区间dp)
- POJ 2955 Brackets(区间dp)
- poj 2955 Brackets (区间dp)||(记忆话搜素)
- poj(2955)——Brackets(区间dp)
- poj 2955 Brackets(区间DP)
- poj 2955 Brackets (区间dp)
- poj 2955 Brackets 区间DP
- POJ 2955 - Brackets(区间DP)
- POJ 2955 Brackets(区间dp)
- POJ-2955 Brackets(括号匹配-区间DP)
- POJ 2955 Brackets(区间DP)
- POJ 2955- Brackets[区间dp]
- poj 2955 Brackets(区间DP)
- POJ - 2955 Brackets (区间DP)
- poj 2955 Brackets (区间DP)
- 区间DP基础篇之 POJ2955——Brackets
- POJ 2955-Brackets(括号匹配-区间DP)
- POJ 2955-Brackets(括号匹配-区间DP)
- poj 2955 Brackets【区间DP】