dp练习

练习1 CF 1107E Vasya and Binary String

考虑区间DP, 只考虑从左侧消除的情况, 因为从右侧转移到左侧与从左侧转移到右侧是等价的

就是说设$dp[l][r][pre]$为$l$前有$pre$个与$l$同色的最大得分, 暴力转移就好了

ll dfs(int l, int r, int pre) {
	if (l>r) return 0;
	ll &ans = dp[l][r][pre];
	if (ans) return ans;
	if (l==r) return ans=a[pre];
	ans = a[pre]+dfs(l+1,r,1);
	REP(i,l+1,r) if (s[i]==s[l]) ans=max(ans,dfs(l+1,i-1,1)+dfs(i,r,pre+1));
	return ans;
}

int main() {
	scanf("%d%s", &n, s+1);
	REP(i,1,n) scanf("%d", a+i);
	printf("%lld\n", dfs(1,n,1));
}

猜你喜欢

转载自www.cnblogs.com/uid001/p/10504202.html