题意:

给出一个长度为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. Wideband Direction of Arrival Estimation Based on Multiple Virtual Extension Arrays

    基于多重虚拟扩展阵列的宽带信号DOA估计[1]. 宽带DOA估计是阵列信号处理领域的一个重要研究方向.在DOAs估计的实际应用中,信号总是会被噪声破坏,在某些情况下,源信号的数量大于传感器的数量,因此 ...

  2. 001_keil仿真

    (一)参考文献:STM32F4 MDK5软件仿真 error : no 'read' permission  (二)转载: 问题描述 CPU:STM32F407MDK5软件模拟提示没有读写权限,只能一 ...

  3. learning scala akka tell pattern(二)

    package com.example import akka.actor._ object Tutorial_02_Tell_Pattern extends App { println(" ...

  4. Redis存储Sortedset

    与set相比Sortedset多了一个数字与set中的各个元素相关联. 存储结构: 1.添加元素: 添加元素的时候元素一定不能相同,如果已存在该元素,表示插入失败返回0,成功返回1,但是不同元素的数字 ...

  5. 洛谷P1081 开车旅行

    题目 双向链表+倍增+模拟. \(70pts\): 说白了此题的暴力就是细节较多的模拟题. 我们设离\(i\)城市最近的点的位置为\(B[i]\),第二近的位置为\(A[i]\).设\(A\)或\(B ...

  6. 前端微信小程序电影类仿淘票票微信小程序

    需求描述及交互分析设计思路和相关知识点电影界面顶部页签切换效果设计正在热映界面布局设计即将上映界面布局设计电影详情页设计我的界面列表导航设计登录设计 相关知识点(1)swiper滑块视图容器组件,可以 ...

  7. hive select 出现问题 SemanticException

    由于把hadoop的以下配置项 <property> <name>fs.defaultFS</name> <value>hdfs://localhost ...

  8. 算法练习题---罗马数字转int

    连接:https://leetcode-cn.com/problems/roman-to-integer/submissions/ 题目: 罗马数字包含以下七种字符: I, V, X, L,C,D 和 ...

  9. Res-DenseNetSegmentation模型调试记录

    参考:https://blog.csdn.net/AbstractSky/article/details/76769202 https://blog.csdn.net/jsliuqun/article ...

  10. shell中$(( ))、$( )、``与${ }的区别

    转 :shell $(( )).$( ).``与${ }的区别 $( )与` `(反引号)命令替换 在bash中,$( )与` `(反引号)都是用来作命令替换的.命令替换与变量替换差不多,都是用来重组 ...