版权声明:转载注明下出处就行了。 https://blog.csdn.net/LJD201724114126/article/details/89256925
题目链接:哆啦A梦传送门
题意:给出一个字符串,找出最多数量的最多括号匹配。
题解:
区间dp。
状态转移:
x字符与y字符匹配 : dp[x][y]+=dp[x+1][y-1]+2。
接着枚举每个中间态。
#include<bits/stdc++.h>
using namespace std;
const int mod=10007;
int dp[110][110];
char str[110];
int main()
{
while(cin>>str)
{
if(strcmp(str,"end")==0) break;
memset(dp,0,sizeof(dp));
int n=strlen(str);
for(int i=1;i<=n;i++)
{
for(int j=0;i+j-1<n;j++)
{
int x=j,y=i+j-1;
///字符x与字符y能匹配
if(str[x]=='('&&str[y]==')'){
dp[x][y]+=dp[x+1][y-1]+2;
}
else if(str[x]=='['&&str[y]==']')
dp[x][y]+=dp[x+1][y-1]+2;
///枚举每个中间态
for(int k=x;k<y;k++)
dp[x][y]=max(dp[x][y],dp[x][k]+dp[k+1][y]);
}
}
printf("%d\n",dp[0][n-1]);
}
return 0;
}
有个自己写的n*n代码,不知为什么过不了,真玄。
#include<bits/stdc++.h>
using namespace std;
const int mod=10007;
int dp[110][110];
char str[110];
int main()
{
while(cin>>str)
{
if(strcmp(str,"end")==0) break;
memset(dp,0,sizeof(dp));
int n=strlen(str);
for(int i=1;i<=n;i++)
{
for(int j=0;i+j-1<n;j++)
{
int x=j,y=i+j-1;
if(str[x]=='('&&str[y]==')'){
dp[x][y]=max(dp[x][y],dp[x+1][y-1]+2);
}
else if(str[x]=='['&&str[y]==']')
dp[x][y]=max(dp[x][y],dp[x+1][y-1]+2);
dp[x][y]=max(dp[x][y],max(dp[x+1][y],dp[x][y-1]));
dp[x][y]=max(dp[x][y],dp[x+1][y-1]);
}
}
printf("%d\n",dp[0][n-1]);
}
return 0;
}