Codeforces1107 E. Vasya and Binary String(区间dp)
Posted live4m
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces1107 E. Vasya and Binary String(区间dp)相关的知识,希望对你有一定的参考价值。
题意:
解法:
bzoj1939的弱化版.
令d[l][r][t]表示[l,r]左边有t个和s[l]相同的数,消除之后能获得的最大价值.
转移方程:
对于d[l][r][t],
1.s[l]单独消除,那么可以用d[l+1][r][0]+a[t+1]更新.
2.如果s[i]=s[l],那么可以先消除[l+1,i-1],然后剩余部分拼接之后为d[i][r][t+1],
即用d[l+1][i-1][0]+d[i][r][t+1]更新.
code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int d[111][111][111];
char s[111];
int a[111];
int n;
int dfs(int l,int r,int t){
if(l>r)return 0;
if(l==r)return a[t+1];
if(d[l][r][t]!=-1)return d[l][r][t];
int ans=0;
ans=max(ans,dfs(l+1,r,0)+a[t+1]);
for(int i=l+1;i<=r;i++){
if(s[i]==s[l]){
ans=max(ans,dfs(l+1,i-1,0)+dfs(i,r,t+1));
}
}
return d[l][r][t]=ans;
}
void solve(){
cin>>n>>(s+1);
for(int i=1;i<=n;i++)cin>>a[i];
memset(d,-1,sizeof d);
int ans=dfs(1,n,0);
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
solve();
return 0;
}
以上是关于Codeforces1107 E. Vasya and Binary String(区间dp)的主要内容,如果未能解决你的问题,请参考以下文章
Educational Codeforces Round #54 (Div. 2) E. Vasya and a Tree 技巧題
[Educational Round 59][Codeforces 1107G. Vasya and Maximum Profit]
CodeForces 1107F. Vasya and Endless Credits
Codeforces 1107 E - Vasya and Binary String
UVA - 10559 Blocks 和 Vasya and Binary String CodeForces - 1107E (dp OR 记忆化搜索)