您的位置:首页 > 其它

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]);
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: