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

  

posted @ 2018-05-04 19:36  执||念  阅读(182)  评论(0编辑  收藏  举报