题意:

给出一个长度为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)的更多相关文章

  1. BZOJ3791:作业(DP)

    Description 众所周知,白神是具有神奇的能力的. 比如说,他对数学作业说一声“数”,数学作业就会出于畏惧而自己完成:对语文作业说一声“语”,语文作业就会出于畏惧而自己完成. 今天,语文老师和 ...

  2. bzoj3791作业*

    bzoj3791作业 题意: 对一个01序列进行染色,每次能将一个区间染上色(可覆盖之前染的),共能染k次,求最大正确染色个数.n≤100000,m≤50. 题解: 结论:染k次最多能把序列分成2*k ...

  3. 【BZOJ3791】作业 DP

    [BZOJ3791]作业 Description 众所周知,白神是具有神奇的能力的.比如说,他对数学作业说一声“数”,数学作业就会出于畏惧而自己完成:对语文作业说一声“语”,语文作业就会出于畏惧而自己 ...

  4. 学校作业-Dp练习

    题目 ★Stringsobits01 串  考虑排好序的 N(N<=31)位二进制数.  你会发现,这很有趣.因为他们是排列好的,而且包含所有可能的长度为 N 且含有 1 的个数小于等于 L(L ...

  5. 【BZOJ3379】[Usaco2004 Open]Turning in Homework 交作业 DP

    [BZOJ3379][Usaco2004 Open]Turning in Homework 交作业 Description     贝茜有C(1≤C≤1000)门科目的作业要上交,之后她要去坐巴士和奶 ...

  6. bzoj3791 作业

    Description 众所周知,白神是具有神奇的能力的. 比如说,他对数学作业说一声“数”,数学作业就会出于畏惧而自己完成:对语文作业说一声“语”,语文作业就会出于畏惧而自己完成. 今天,语文老师和 ...

  7. BZOJ3791 作业 动态规划

    你发现染 $k$ 次最多会将这个序列分成 $2k-1$ 段,然后任何 $2k-1$ 段以内的方案一定能被构建出来,所以直接 dp 就好了 #include <bits/stdc++.h> ...

  8. hdu 1074(状态压缩dp+记录路径)

    题意:给了n个家庭作业,然后给了每个家庭作业的完成期限和花费的实践,如果完成时间超过了期限,那么就要扣除分数,然后让你找出一个最优方案使扣除的分数最少,当存在多种方案时,输出字典序最小的那种,因为题意 ...

  9. [UOJ422][集训队作业2018]小Z的礼物——轮廓线DP+min-max容斥

    题目链接: [集训队作业2018]小Z的礼物 题目要求的就是最后一个喜欢的物品的期望得到时间. 根据$min-max$容斥可以知道$E(max(S))=\sum\limits_{T\subseteq ...

随机推荐

  1. react基本语法及组件

    一.react简介 1.起源:React 起源于 Facebook 的内部项目,用来架设 Instagram 的网站,并于 2013 年 5 月开源. 2.特点: 1.声明式设计 −React采用声明 ...

  2. 集成omnibus-ctl 开发一个专业的软件包管理工具

    前边有转发过来自chef 团队的一篇omnibus-ctl 介绍文章,以下尝试进行项目试用 就是简单的集成,没有多少复杂的操作 环境准备 ruby ruby 使用2.6.3 使用 rbenv 安装,可 ...

  3. 单页面应用程序(SPA)

    一.概念 ①在一个页面上实现网站的大部分功能,就是单页面应用程序,是一种常见的网页开发模式. ②整个网站就只有一个Html文件,每次在切换页面时,不需要请求服务器,只要通过本地的js来切换即可.这样可 ...

  4. Js 在页面中输入消息的几种方式

    一.方式 alert(“”); confirm(“”) ; prompt(“”);         接收用户信息 console.log(“”);      在网页控制台中输出消息 document. ...

  5. SQL基础-创建新的输出字段

    一.创建新的输出字段 1.建表.插数据 ### CREATE TABLE `t_stock_trans_dtl` ( `trans_id` varchar(100) NOT NULL COMMENT ...

  6. Android中LayoutInflater()方法

    在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例 ...

  7. 解决PHP7无法监听9000端口问题/502错误解决办法

    问题背景 昨晚帮配置nginx+php服务的时候,发生了一个奇怪的事情netstat -anp|grep 9000查看9000端口,一直没有监听,于是nginx无法通过fastcgi来代理php请求. ...

  8. Monkey框架(基础知识篇) - monkey启动与参数介绍

    一.monkey启动 直接PC启动:> adb shell monkey [options] <count> shell 端启动:> adb shell >monkey ...

  9. Python常用模块大全

    Python常用模块大全 os模块: os.remove() 删除文件 os.unlink() 删除文件 os.rename() 重命名文件 os.listdir() 列出指定目录下所有文件 os.c ...

  10. Java线程同步的Monitor机制(Lock配合Condition)

    Monitor模式是一种常见的并行开发机制, 一个Monitor实例可以被多个线程安全使用, 所有的monitor下面的方法在运行时是互斥的, 这种互斥机制机制可以用于一些特性, 例如让线程等待某种条 ...