区间dp
https://vjudge.net/contest/226480#problem/B
参考博客:https://blog.csdn.net/limhhhhh/article/details/50599551
#include<iostream>
#include<cstring>
using namespace std;
int solve(char a,char b)
{
if((a=='('&&b==')')||(a=='['&&b==']'))
return 1;
else
return 0;
}
int main()
{
char s[110];
while(cin>>s)
{
if(s[0]=='e')
break;
int len=strlen(s);
int dp[110][110];
memset(dp,0,sizeof(dp));
for(int i=0;i<len;i++)
{
if(solve(s[i],s[i+1]))
dp[i][i+1]=2;
}
for(int i=3;i<=len;i++)
{
for(int j=0;j+i-1<len;j++)
{
if(solve(s[j],s[j+i-1]))
dp[j][j+i-1]=dp[j+1][j+i-2]+2;
for(int k=j;k<i+j-1;k++)
{
dp[j][j+i-1]=max(dp[j][i+j-1],dp[j][k]+dp[k+1][j+i-1]);
}
}
}
cout<<dp[0][len-1]<<endl;
}
return 0;
}
https://vjudge.net/contest/226480#problem/A
参考博客 :https://blog.csdn.net/qq_33362864/article/details/75269282
#include<iostream> #include<cmath> #include<cstring> using namespace std; int main() { int t,Case=1; int dp[150][150]; cin>>t; while(t--) { memset(dp,0,sizeof(dp)); int n; cin>>n; int a[150]; for(int i=0;i<n;i++) cin>>a[i]; for(int i=n-1;i>=0;i--) { for(int j=i;j<n;j++) { dp[i][j]=dp[i+1][j]+1; for(int k=i+1;k<=j;k++) { if(a[k]==a[i]) dp[i][j]=min(dp[i][j],dp[i+1][k-1]+dp[k][j]); } } } cout<<"Case "<<Case<<": "<<dp[0][n-1]<<endl; Case++; } return 0; }
https://vjudge.net/contest/226480#problem/C
参考博客 :https://blog.csdn.net/sdjzping/article/details/19160013
#include<iostream>
#include<cstring>
#define mod 1000000007
long long dp[750][750][3][3];
char s[750];
int tmp[750],match[750];
//0代表不涂色,1代表涂红色,2代表涂蓝色
void dfs(int l,int r)
{
if(l+1==r)
{
dp[l][r][0][1]=1;
dp[l][r][0][2]=1;
dp[l][r][1][0]=1;
dp[l][r][2][0]=1;
return ;
}
if(match[l]==r)
{
dfs(l+1,r-1);
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if(j!=1)
dp[l][r][0][1]=(dp[l][r][0][1]+dp[l+1][r-1][i][j])%mod;
if(j!=2)
dp[l][r][0][2]=(dp[l][r][0][2]+dp[l+1][r-1][i][j])%mod;
if(i!=1)
dp[l][r][1][0]=(dp[l][r][1][0]+dp[l+1][r-1][i][j])%mod;
if(i!=2)
dp[l][r][2][0]=(dp[l][r][2][0]+dp[l+1][r-1][i][j])%mod;
}
}
return ;
}
else
{
int p=match[l];
dfs(l,p);
dfs(p+1,r);
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
for(int k=0;k<3;k++)
{
for(int q=0;q<3;q++)
{
if(!((k==1&&q==1)||(k==2&&q==2)))
dp[l][r][i][j]=(dp[l][r][i][j]+(dp[l][p][i][k]*dp[p+1][r][q][j])%mod)%mod;
}
}
}
}
}
return ;
}
void getmatch(int len)
{
int p=0;
for(int i=0;i<len;i++)
{
if(s[i]=='(')
tmp[p++]=i;
else
{
match[i]=tmp[p-1];
match[tmp[p-1]]=i;
p--;
}
}
}
using namespace std;
int main()
{
while(cin>>s)
{
int len=strlen(s);
memset(dp,0,sizeof(dp));
getmatch(len);
dfs(0,len-1);
long long ans=0;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
ans=(ans+dp[0][len-1][i][j])%mod;
}
cout<<ans<<endl;
}
return 0;
}
当初的梦想实现了吗,事到如今只好放弃吗~

浙公网安备 33010602011771号