BZOJ3791 作业(DP)
题意:
给出一个长度为n的01序列;
你可以进行K次操作,操作有两种:
1.将一个区间的所有1作业写对,并且将0作业写错;
2.将一个区间的所有0作业写对,并且将1作业写错;
求K次操作后最多写对了多少作业;
n<=100000,k<=50;
题解
性质:在一段区间内染色k次,每次是一段连续的,那么这个区间最多被分为2*k-1段
证明:每次染区间中间位置,最终只会染出2*k-1段(还是不明白的自己画画图)
解题思路:
令dp[i][j][k]表示 当前考虑到第i本作业,1-i这段区间被染成了j段,第i本作业染为k(0或1)
则状态转移方程为
第i本作业由两种状态转移过来:
一、继承了i-1的状态,也就是原本有一次染色是染到i-1为止,现在把i也连着染一下,此时染色次数不变 即 dp[i-1][j][k]
二、从i开始新一次的染色,此时i-1的状态应该和i的状态是相反的,因为如果是相同的状态的话就没必要新一次染色了,此时染色次数要+1 即dp[i-1][j-1][k^1]
即:dp[i][j][0]=max(dp[i-1][j-1][1],dp[i-1][j][0])+(a[i]==0);
dp[i][j][1]=max(dp[i-1][j-1][0],dp[i-1][j][1])+(a[i]==1);
代码如下:
#include<bits/stdc++.h>
using namespace std;
int a[];
int dp[][][];
int n,K;
int read(){
int ans=;char c=getchar();
while(!(c>=''&&c<='')) c=getchar();
while(c>=''&&c<=''){
ans=ans*+c-;
c=getchar();
}
return ans;
}
int main(){
freopen("hwk.in","r",stdin);
freopen("hwk.out","w",stdout);
n=read();K=read();
for(int i=;i<=n;i++)
a[i]=read();
int ans=,i;
if(K==){
printf("");
return ;
}
for(int j=;j<=*K-;j++){
for(i=;i<=n;i++){
dp[i][j][]=max(dp[i-][j-][],dp[i-][j][])+(a[i]==);
dp[i][j][]=max(dp[i-][j-][],dp[i-][j][])+(a[i]==);
ans=max(ans,max(dp[i][j][],dp[i][j][]));
}
}
printf("%d",ans);
return ;
}
BZOJ3791 作业(DP)的更多相关文章
- BZOJ3791:作业(DP)
Description 众所周知,白神是具有神奇的能力的. 比如说,他对数学作业说一声“数”,数学作业就会出于畏惧而自己完成:对语文作业说一声“语”,语文作业就会出于畏惧而自己完成. 今天,语文老师和 ...
- bzoj3791作业*
bzoj3791作业 题意: 对一个01序列进行染色,每次能将一个区间染上色(可覆盖之前染的),共能染k次,求最大正确染色个数.n≤100000,m≤50. 题解: 结论:染k次最多能把序列分成2*k ...
- 【BZOJ3791】作业 DP
[BZOJ3791]作业 Description 众所周知,白神是具有神奇的能力的.比如说,他对数学作业说一声“数”,数学作业就会出于畏惧而自己完成:对语文作业说一声“语”,语文作业就会出于畏惧而自己 ...
- 学校作业-Dp练习
题目 ★Stringsobits01 串 考虑排好序的 N(N<=31)位二进制数. 你会发现,这很有趣.因为他们是排列好的,而且包含所有可能的长度为 N 且含有 1 的个数小于等于 L(L ...
- 【BZOJ3379】[Usaco2004 Open]Turning in Homework 交作业 DP
[BZOJ3379][Usaco2004 Open]Turning in Homework 交作业 Description 贝茜有C(1≤C≤1000)门科目的作业要上交,之后她要去坐巴士和奶 ...
- bzoj3791 作业
Description 众所周知,白神是具有神奇的能力的. 比如说,他对数学作业说一声“数”,数学作业就会出于畏惧而自己完成:对语文作业说一声“语”,语文作业就会出于畏惧而自己完成. 今天,语文老师和 ...
- BZOJ3791 作业 动态规划
你发现染 $k$ 次最多会将这个序列分成 $2k-1$ 段,然后任何 $2k-1$ 段以内的方案一定能被构建出来,所以直接 dp 就好了 #include <bits/stdc++.h> ...
- hdu 1074(状态压缩dp+记录路径)
题意:给了n个家庭作业,然后给了每个家庭作业的完成期限和花费的实践,如果完成时间超过了期限,那么就要扣除分数,然后让你找出一个最优方案使扣除的分数最少,当存在多种方案时,输出字典序最小的那种,因为题意 ...
- [UOJ422][集训队作业2018]小Z的礼物——轮廓线DP+min-max容斥
题目链接: [集训队作业2018]小Z的礼物 题目要求的就是最后一个喜欢的物品的期望得到时间. 根据$min-max$容斥可以知道$E(max(S))=\sum\limits_{T\subseteq ...
随机推荐
- CF547E Mike and Friends 后缀自动机+线段树合并
裸题,敲完后没调就过了 ~ code: #include <bits/stdc++.h> using namespace std; #define ll long long #define ...
- H5 利用vue实现图片上传功能。
H5的上传图片如何实现呢? 以下是我用vue实现的图片上传功能,仅供参考. <!DOCTYPE html> <html> <head> <meta chars ...
- CLR内部异常(中)
不捕捉某一个异常 常常有这种情况,代码不需要捕捉异常,但需要执行一些清理或者修正操作.虽然不总是,支持物(holders)经常用在这种场景里.在支持物(holders)不适用的情况里,CLR提供了两个 ...
- CF1237E 【Balanced Binary Search Trees】
首先我们要注意到一个性质:由于根与右子树的根奇偶性相同,那么根的奇偶性与\(N\)相同 然后我们发现对于一个完美树,他的左右两个儿子都是完美树 也就是说,一颗完美树是由两棵完美树拼成的 注意到另一个性 ...
- CF888G 【Xor-MST】
妙妙题-- 看到\(MST\),想到\(Kruskal\),看到异或,想到\(Trie\) 首先我们模拟一下\(Kruskal\)的流程:找到最小边,如果联通就忽略,未联通就加边 我们把所有点权值加入 ...
- 【luoguP2997】[USACO10NOV]旗帜Banner
题目链接 长和宽的gcd(x,y)=1,就没有中间结点,一种线段有两种方向,暴力统计一下就好了 注意x=0或y=0时的线段只有一种方向 #include<iostream> #includ ...
- vuex基础入门
Vuex简介 vuex的安装和组成介绍 [外链图片转存失败(img-nWQUUuyh-1565273314232)(https://upload-images.jianshu.io/upload_im ...
- 白天不懂夜的黑追寻Android规范
有趣有内涵的文章第一时间送达! 喝酒I创作I分享 关注我,每天都有优质技术文章推送,工作,学习累了的时候放松一下自己. 本篇文章同步微信公众号 欢迎大家关注我的微信公众号:「醉翁猫咪」 生活中总有些东 ...
- Android App专项测试
https://www.jianshu.com/p/141b84f14505 http://www.cnblogs.com/finer/p/9601140.html 专项 概念 adb命令 App启动 ...
- element ui里面table分页,页数从0开始的怎么做?
需求: 后台请求的接口是从0页开始的,但是pagination是从1开始的,就是在点击pagination的第1页是后台转0 1首先在data里面定义为1,其他地方也是定义1 return { for ...