Codeforces1107E. Vasya and Binary String
题目链接
本题也是区间dp,但是需要保存的信息很多,是1还是0,有多少个连续的,那我们可以预处理,将所有的连续缩合成1个字符,那么字符串就变成了一个01交替的串,我们任意的消除1个部分,一定能引起连锁反应,像消消乐
我们设dpi,j,k为区间[i,j],j后面有k个与j相同的元素,若j与前面的i-j-1一起消,状态转移为:dpi,j,k=dpi,m,k+siz[j]+dpm+1,j-1,0,(m与j的字符相同)意思是合并i到m,m+1到j-1合并后,将i到m与j再合并,如果j单独消,dpi,j,k=dpi,j-1,0+f[siz[j]+k]
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) ((x)&(-x))
typedef long long LL;
typedef pair<int,int> pii;
const int maxn = 105;
char s[maxn];
LL dp[maxn][maxn][maxn], f[maxn], cost[maxn];
int n, siz[maxn], bit[maxn], cnt;
void prework() {
for(int i = 1; i <= n; ++i)
for(int j = i; j <= n; ++j)
f[j] = max(f[j], f[j-i] + cost[i]);
cnt = 0;
int now = 0;
for(int i = 1; i <= n; ++i) {
if(i == 1 || s[i] == s[i-1]) ++now;
else {
siz[++cnt] = now;
bit[cnt] = s[i-1] - '0';
now = 1;
}
}
siz[++cnt] = now, bit[cnt] = s[n] - '0';
}
LL DP(int l, int r, int k) {
if(l == r) return dp[l][r][k] = f[siz[r]+k];
if(dp[l][r][k] != -1) return dp[l][r][k];
LL t = DP(l, r-1, 0) + f[siz[r] + k];
for(int i = l; i < r-1; ++i)
if(bit[i] == bit[r])
t = max(t, DP(l, i, k+siz[r])+DP(i+1, r-1, 0));
return dp[l][r][k] = t;
}
void run_case() {
cin >> n;
cin >> (s+1);
for(int i = 1; i <= n; ++i) cin >> cost[i];
prework();
memset(dp, -1, sizeof(dp));
cout << DP(1, n, 0);
}
int main() {
ios::sync_with_stdio(false), cin.tie(0);
cout.flags(ios::fixed);cout.precision(10);
//int t; cin >> t;
run_case();
cout.flush();
return 0;
}
转自
https://blog.csdn.net/litble/article/details/87290658
Codeforces1107E. Vasya and Binary String的更多相关文章
- Codeforces1107E Vasya and Binary String 记忆化dp
Codeforces1107E 记忆化dp E. Vasya and Binary String Description: Vasya has a string \(s\) of length \(n ...
- Codeforces 1107 E - Vasya and Binary String
E - Vasya and Binary String 思路:区间dp + 记忆化搜索 转移方程看上一篇博客. 代码: #pragma GCC optimize(2) #pragma GCC opti ...
- CF 1107 E. Vasya and Binary String
E. Vasya and Binary String 链接 分析: 对于长度为x的一段序列,我们可以dp出消除的过程的最优方案,背包即可. 然后区间dp,可以先合并完所有的点,即没相同的一段区间合并为 ...
- [CF1107E]Vasya and Binary String【区间DP】
题目描述 Vasya has a string s of length n consisting only of digits 0 and 1. Also he has an array a of l ...
- CF1107E Vasya and Binary String
比赛的时候又被垃圾题艹翻了啊. 这个题显然是区间dp 考虑怎么转移. 类似消除方块和ZYB玩字符串那样的一个DP. 可以从左到右依次考虑消除. dp[l][r][k][flag]表示区间l,r左边粘着 ...
- Vasya and Binary String(来自codeforces
题目大意: 给定一个0/1字符串,每次你可以将此字符串中一段连续的任意长度的0/1子串消除掉,注意每次消除的子串中只能有0或者1一种字符,消除掉一串长度为i的0/1字符串会得到a[i]的收益,问将这个 ...
- Codeforces 1107E (Vasya and Binary String) (记忆化,DP + DP)
题意:给你一个长度为n的01串,和一个数组a,你可以每次选择消除一段数字相同的01串,假设消除的长度为len,那么收益为a[len],问最大的收益是多少? 思路:前两天刚做了POJ 1390,和此题很 ...
- CF - 1107 E Vasya and Binary String DP
题目传送门 题解: dp[ l ][ r ][ k ] 代表的是[l, r]这段区间内, 前面有k-1个连续的和s[l]相同且连续的字符传进来的最大值. solve( l, r, k) 代表的是处理 ...
- Binary String Matching
问题 B: Binary String Matching 时间限制: 3 Sec 内存限制: 128 MB提交: 4 解决: 2[提交][状态][讨论版] 题目描述 Given two strin ...
随机推荐
- 【学习笔记】《Java编程思想》 第8~11章
第八章 多态 多态的条件: 1. 要有继承 2.父类对象引用子类对象 3. 要有方法的重写 多态的作用:消除类型之间的耦合关系. 将一个方法调用与一个方法主体关联起来称作绑定.若在程序执行前进行绑定, ...
- git上传时出现ERROR: Repository not found.的解决办法
今天在上传时出现错误,原因是之前更改了gitee上的个人空间地址,导致找不到.需要重新配置 https://gitee.com/help/articles/4114#article-header0
- Bugku-CTF加密篇之来自宇宙的信号(银河战队出击)
来自宇宙的信号 银河战队出击 flag格式 flag{字母小写}
- 08day 操作命令以及目录结构
yum /var/log目录(日志文件)两个重要目录:message--记录系统或服务程序运行状态信息 secure--记录用户登录信息 tail -f 查看日志方法 head 查问文件头部
- 多核 CPU 和多个 CPU 有何区别?
原文来自:http://www.solves.com.cn/it/yj/CPU/2019-06-24/1122.html 多核CPU和多CPU的区别主要在于性能和成本.多核CPU性能最好,但成本最高: ...
- Linux中配置JDK的环境变量
一. 解压安装jdk 在shell终端下进入jdk-6u14-linux-i586.bin文件所在目录, 执行命令 ./jdk-6u14-linux-i586.bin 这时会出现一段协议,连继敲回车, ...
- Adobe PS
1. ctrl + Tab 切换视图窗口 2.shift 拖拽图片,将 2 张图片放在一起 3.切换显示方式 /全屏/带有工具栏 快捷键:F 4. 缩小/放大工具 快捷键: alt + 鼠标滑轮 5 ...
- 【Python redis】
目录 基本用法 连接池 基本命令 String Hash List set "下载:pip install redis @ *** 基本用法 redis库提供两个类,Redis和Strict ...
- JavaMail实现带附件的收发邮件
一.前言 参考博客: http://blog.csdn.net/xietansheng/article/details/51722660 http://www.cnblogs.com/HigginCu ...
- 萌新深度学习与Pytorch入门记录(一):Win10下环境安装
深度学习从入门到入土,安装软件及配置环境踩了不少坑,过程中参考了多处博主给的解决方法,遂整合一下自己的采坑记录. (若遇到不一样的错误,请参考其他博主答案解决) 笔者电脑系统为win10系统,在此环境 ...