POJ 2955 Brackets 区间DP
2014-11-14 17:10
465 查看
思路:
枚举长度,然后根据长度枚举起点以及终点,如果s[j]和s[k]构成一对匹配的括号,dp[j,k]就是dp[j+1,k-1]的基础上+2。
然后再扫描一遍j,k之间用何种方式能达到最大。
状态转移方程:dp[j][k]=max(dp[j][x]+dp[x][k],dp[i][j]);
枚举长度,然后根据长度枚举起点以及终点,如果s[j]和s[k]构成一对匹配的括号,dp[j,k]就是dp[j+1,k-1]的基础上+2。
然后再扫描一遍j,k之间用何种方式能达到最大。
状态转移方程:dp[j][k]=max(dp[j][x]+dp[x][k],dp[i][j]);
#include<stdio.h> #include<string.h> #include<stdlib.h> int dp[110][110]; int max(int x,int y) { if(x>y) return x; return y; } int main() { int n,i,j,k,ans,x; char s[110]; while(scanf("%s",s),strcmp(s,"end")) { n=strlen(s); ans=0; memset(dp,0,sizeof(dp)); for(i=1;i<n;i++) { for(j=0,k=i;k<n;j++,k++) { if((s[j]=='('&&s[k]==')')||(s[j]=='['&&s[k]==']')) dp[j][k]=dp[j+1][k-1]+2; for(x=j+1;x<k;x++) dp[j][k]=max(dp[j][k],dp[j][x]+dp[x][k]); ans=max(dp[j][k],ans); } } printf("%d\n",ans); } 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 括号匹配)
- NYOJ 15 括号匹配(二) POJ 2955 Brackets(区间dp)
- poj 2955 Brackets(区间DP)
- POJ 2955-Brackets(区间DP)
- POJ2955 Brackets(区间DP)
- Brackets POJ - 2955 区间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)