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; }