Vasya and Binary String(来自codeforces

题目大意:

给定一个0/1字符串,每次你可以将此字符串中一段连续的任意长度的0/1子串消除掉,注意每次消除的子串中只能有0或者1一种字符,消除掉一串长度为i的0/1字符串会得到a[i]的收益,问将这个字符串完全消除的最大收益

Examples

Input

     7 

     1101001

     3 4 9 100 1 2 3

Output
109
Input

    5

   10101 

    3 10 15 15 15

Output
23

第一个样例是1101001 →→ 111001 →→ 11101 →→ 1111 →→ ∅ .

第二个样例是10101 →→ 1001 →→ 11 →→ ∅ .

区间dp+记忆化搜索

 #include<bits/stdc++.h>
using namespace std;
long long n,i;
long long s[105];
long long a[105];
long long f[105][105][55];
long long dfs(long long l,long long r,long long x)
{
	long long ans,j;
    if(l>r)return 0;
    if(f[l][r][x]!=-1)return f[l][r][x];
    if(l==r)return f[l][r][x]=a[x];
    
    ans=a[x]+dfs(l+1,r,1);
    for(j=l;++j<=r;)
	  if(s[j]==s[l])ans=max(ans,dfs(l+1,j-1,1)+dfs(j,r,x+1));
    return f[l][r][x]=ans;
} 
int main()
{
    for(scanf("%lld",&n),memset(f,-1,sizeof(f)),i=0;++i<=n;)scanf("%1lld",&s[i]);
    for(i=0;++i<=n;)scanf("%d",&a[i]);
	 
    printf("%lld",dfs(1,n,1));
    return 0;
}

 代码很简单(第一次在博客园写博客,有什么不足,请说明~~)

谢谢观赏~~

猜你喜欢

转载自www.cnblogs.com/xinganyu/p/xinganyu_Rowen_Chan.html
今日推荐