📄 2537531_wa.cpp
字号:
#include <stdio.h>
#include <string.h>
#define INF 1000000
int min(int a,int b)
{
return a<b?a:b;
}
char str[101];
int DP[101][101];
int caled[101][101];
int dp(int i,int j)
{
int k, ans;
if(caled[i][j])
return DP[i][j];
if(i>j)
return 0;
if(i==j)
{
caled[i][j] = 1;
DP[i][j] = 1;
return 1;
}
ans = INF;
if(str[i]=='('&&str[j]==')')
{
DP[i][j] = dp(i+1,j-1);
caled[i][j] = 1;
return DP[i][j];
}
if(str[i]=='['&&str[j]==']')
{
DP[i][j] = dp(i+1,j-1);
caled[i][j] = 1;
return DP[i][j];
}
if(str[i]=='('||str[i]=='[')
ans = min(ans,dp(i+1,j)+1);
if(str[j]==')'||str[j]==']')
ans = min(ans,dp(i,j-1)+1);
for(k = i; k < j; k++)
ans = min(ans,dp(i,k)+dp(k+1,j));
DP[i][j] = ans;
caled[i][j] = 1;
return ans;
}
void solve(int i,int j)
{
int k;
if(i>j)
return ;
if(i==j)
{
if(str[i]==')'||str[i]=='(')
printf("()");
else
printf("[]");
return ;
}
if((str[i]=='('&&str[j]==')')||(str[i]=='['&&str[j]==']'))
{
printf("%c",str[i]);
solve(i+1,j-1);
printf("%c",str[j]);
return ;
}
for(k = i; k < j; k++)
{
if(DP[i][k]+DP[k+1][j]==DP[i][j])
{
solve(i,k);
solve(k+1,j);
return ;
}
}
}
int main()
{
scanf("%s",str);
memset(DP,0,sizeof(DP));
memset(caled,0,sizeof(caled));
dp(0,strlen(str)-1);
solve(0,strlen(str)-1);
printf("\n");
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -