DP 1007E

链接:https://codeforces.com/contest/1107/problem/E

大意:给一个100长度的01串s,规定字符相同的子串可以消掉,消掉长度为i的子串得分pi,求最多能得多少分,

解法:

dp[st][en][suc]代表[st,en]的子串从前面借到了suc个跟s[st]一样字符,这一段可以得到多少分

对于s[st]这个从前面继承到的字符可以从这里断掉,得到p[suc+1]+dp[st+1][en][0]

也可以把自己的这个字符继续继承下去,把自己和自己的前辈交给下一个跟s[st]相同的点j,得到

dp[j][en][suc+1]+dp[i+1][j-1][0]

核心代码:

const int maxn = int(110);
int n; string s;
int a[maxn];
ll dp[maxn][maxn][maxn];
ll solve(int st, int en, int suc = 0)
{
	ll &ret = dp[st][en][suc];
	if(ret != -1)return ret;

	if (st == en + 1)return 0;
	else if (st > en)ret = -inf * 1LL * inf;
	else if (en == st)return a[suc + 1];
	else
	{
		ret = a[suc + 1] + solve(st + 1, en);
		for (int i = st + 1; i <= en; ++i)
		{
			if (s[st] == s[i])
			{
				ret = max(ret, solve(i, en, suc + 1) + solve(st + 1, i - 1));
			}
		}
	}
	return ret;
}

		memset(dp, -1, sizeof(dp));
		cin >> n >> s; s = ' ' + s + ' ';
		RE2(i, n)cin >> a[i];
		cout << solve(1, n) << endl;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值