动态规划题,设dp[i][j]为第i个字符到第j个字符最少的添加括号数
递推和记忆化各一波~
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;
#define PI 3.1415926535897932
#define E 2.718281828459045
#define INF 0x3f3f3f3f
#define mod 9973
#define N 70
typedef long long ll;
const int M=1005;
ll n,m;
int cnt;
int sx,sy,sz;
char mp[M];
int pa[M],rankk[M];
int head[M*6],vis[M*6];
double dis[M][10];
ll prime[M*1000];
bool isprime[M*1000];
int lowcost[M],closet[M];
char st1[5050],st2[5050];
int len[M*6];
//pair<int ,int> a[M];
vector<int> g[M];
int dp[2005][2005];
int add,rem;
struct node
{
int st,s;
};
bool cmp(node a,node b)
{
if(a.st!=b.st)
return a.st<b.st;
return a.s<b.s;
}
int month[13]= {0,31,59,90,120,151,181,212,243,273,304,334,0};
bool isrun(int year)
{
if((year%4==0&&year%100!=0)||(year%400==0))
return true;
return false;
}
void getpri()
{
ll i;
int j;
cnt=0;
memset(isprime,false,sizeof(isprime));
for(i=2; i<1000000LL; i++)
{
if(!isprime[i])prime[cnt++]=i;
for(j=0; j<cnt&&prime[j]*i<1000000LL; j++)
{
isprime[i*prime[j]]=1;
if(i%prime[j]==0)break;
}
}
}
ll qk_mul(ll a,ll b,ll mo)
{
ll t=0;
while(b)
{
if(b&1)
t=(t+a)%mo;
a=(a<<1)%mo;
b>>=1;
}
t%=mo;
return t;
}
ll qk_mod(ll a,ll b,ll mo)
{
ll ans=1;
while(b)
{
if(b&1) ans=qk_mul(ans,a,mo);
a=qk_mul(a,a,mo);
b>>=1;
}
ans%=mo;
return ans;
}
int gcd(int a,int b)
{
return b == 0 ? a : gcd(b, a%b);
}
int dfs(int l,int r)
{
int uu=INF;
if(l>r) return 0;
if(dp[l][r]!=-1) return dp[l][r];
if(l==r) return 1;
else {
if((st1[l]=='['&&st1[r]==']')||(st1[l]=='('&&st1[r]==')'))
uu=min(uu,dfs(l+1,r-1));
if(st1[l]=='('||st1[l]=='[')
uu=min(uu,dfs(l+1,r)+1);
if(st1[r]==')'||st1[r]==']')
uu=min(uu,dfs(l,r-1)+1);
for(int k=l;k<r;k++)
{
uu=min(uu,dfs(l,k)+dfs(k+1,r));
}
}
return dp[l][r]=uu;
}
int main()
{
int k,l,i,j,len;
scanf("%s",st1);
len=strlen(st1);
memset(dp,-1,sizeof(dp));
/*for(i=1; i<=len; i++)
dp[i][i]=1;
for(l=2; l<=len; l++)
for(i=1; i<len; i++)
{
j=i+l-1;
dp[i][j]=INF;
if((st1[i]=='['&&st1[j]==']')||(st1[i]=='('&&st1[j]==')'))
dp[i][j]=min(dp[i][j],dp[i+1][j-1]);
if(st1[i]=='('||st1[i]=='[')
dp[i][j]=min(dp[i][j],dp[i+1][j]+1);
if(st1[j]==')'||st1[j]==']')
dp[i][j]=min(dp[i][j],dp[i][j-1]+1);
for(k=i;k<j;k++)
{
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]);
}
}
*/
printf("%d\n",dfs(0,len-1));
return 0;
}