bzoj 3791: 作业

23333开始了为期不知道多少天的DP专题23333

(上来第一个大水题就不会,跪)

k次修改,最多会产生2*k-1个不同的区间。。然后dp搞一下。。(可以压一维)

 1 /*#include<cstdio>
 2 #include<iostream>
 3 #define N 100005
 4 using namespace std;
 5 int n,K,size[N],a[N],f[55][N][2];
 6 int ans,pp,p,qq,q,tot;
 7 int main()
 8 {
 9     scanf("%d %d",&n,&K); a[0]=-1;
10     for (int i=1; i<=n; i++) scanf("%d",&a[i]);
11     for (int i=1; i<=n; i++)
12     {
13         if (a[i]!=a[i-1]) tot++;
14         size[tot]++;
15     }
16     pp=0; qq=1;
17     if (a[1]==1) pp^=1,qq^=1;
18     for (int k=1; k<=K; k++)
19     {
20         p=pp; q=qq;
21         for (int i=1; i<=tot; i++)
22         {
23             f[k][i][p]=max(f[k][i][p],f[k][i-1][p]+size[i]);
24             if (k>1) f[k][i][p]=max(f[k][i][p],size[i-1]+f[k-1][i-2][p]+size[i]);
25             f[k][i][q]=max(f[k][i][q],f[k][i-1][q]);
26         //    ans=max(f[k][i][p],ans);
27         //    if (ans==6) printf("%d %d %d     %d\n",k,i,p,f[k][i][p]);
28             p^=1; q^=1;
29         }
30     }
31     printf("%d",max(f[K][tot][1],f[K][tot][0]));
32     return 0;
33 }*/
34 /*
35 19 2
36 1 1 1 --0 0 0 0 1 0 1 1 1 0 1 0 0 0 0 --1
37 */
38
39 #include<cstdio>
40 #include<iostream>
41 #define N 100005
42 using namespace std;
43 int n,K,ans;
44 int a[100005],f[2][105][2];
45 int main()
46 {
47     scanf("%d%d",&n,&K);
48     for (int i=1; i<=n; i++) scanf("%d",&a[i]);
49     f[1][1][a[1]]=1;
50     for (int i=1,p=1,q=0; i<n; i++,swap(p,q))
51     {
52         for (int j=1; j<=2*K-1; j++)
53             for (int x=0; x<2; x++)
54                 for (int y=0; y<2; y++)
55                     f[q][j+(x!=y)][y]=max(f[q][j+(x!=y)][y],f[p][j][x]+(a[i+1]==y));
56         for (int j=1; j<=2*K-1; j++)
57         {
58             f[p][j][0]=f[p][j][1]=0;
59             ans=max(ans,max(f[q][j][1],f[q][j][0]));
60         }
61     }
62     printf("%d\n",ans);
63     return 0;
64 }
时间: 2024-10-14 09:35:52

bzoj 3791: 作业的相关文章

[BZOJ 3791] 作业 【DP】

题目链接:BZOJ - 3791 题目分析 一个性质:将一个序列染色 k 次,每次染连续的一段,最多将序列染成 2k-1 段不同的颜色. 那么就可以 DP 了,f[i][j][0|1] 表示到第 i 个位置,染了 j 段,当前这一段颜色为 0|1 的最大价值. f[i][][] 只与 f[i-1][][] 有关,第一维用滚动数组就可以了. 代码 #include <iostream> #include <cstdio> #include <cstring> #inclu

【算法】莫队算法初探

[算法介绍] 莫队算法是用于离线处理处理区间问题的一类算法,非常易于理解和上手,应用面十分广泛,甚至还可以在树上进行操作. 当我们得到$[L,R]$的答案之后,如果能够以较低的复杂度扩展得到$[L-1,R],[L+1,R],[L,R-1],[L,R+1]$的答案,我们就可以使用莫队算法,通常这个扩展的复杂度是$O(1)$或$O(logn)$. 如果我们对于每个询问都暴力移动左右端点,那么复杂度肯定是$O(n^2)$的,而莫队算法的精髓就在于结合了分块的思想. 设扩展一次的复杂度为$O(f(n))

矩阵乘法专题4——bzoj 2326 [HNOI2011] 数学作业 题解

转载请注明:http://blog.csdn.net/jiangshibiao/article/details/24963747 [原题] 2326: [HNOI2011]数学作业 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 853  Solved: 473 [Submit][Status] Description [分析]我们按数字的位数来划分.对于K位数,我们就可以专门设计一个矩阵来计算. 然后就是注意细节了. [代码] #include

树套树专题——bzoj 3110: [Zjoi2013] K大数查询 &amp; 3236 [Ahoi2013] 作业 题解

[原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 978  Solved: 476 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少. Input 第一行N,M 接下来M行,每行形如1 a b c或2 a b c Outpu

bzoj 3236: [Ahoi2013]作业(缺线段树)

3236: [Ahoi2013]作业 Time Limit: 100 Sec  Memory Limit: 512 MBSubmit: 1744  Solved: 702[Submit][Status][Discuss] Description Input Output Sample Input 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 Sample Output 2 2 1 1 3 2 2 1 HINT N=100000,M=1000000 Sourc

【BZOJ 2326】 [HNOI2011]数学作业

2326: [HNOI2011]数学作业 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1100  Solved: 625 [Submit][Status] Description 矩阵乘法. 可以用类似于秦九韶算法,把被取模的数拆开. 如123%m=(((1%m)*10+2)%m*10+3)%m 我们发现对于位数相同的数的计算方法是一样的,想到矩阵乘法. 对于1位的数: matrix x=10^1  0  0 1       1  0 0  

【HNOI 2011】BZOJ 2326-数学作业

按照教练的要求来写一写历年HNOI的题目...挑几道好写的来做 题意我就不说了. 一开始就被BZOJ上的Tag剧透了个爽,直接省掉70%的思考过程... 很容易可以得出的O(n)递推式 :f[n] = f[n-1] * 10 len(n) + n 然后我们考虑如何用矩阵乘法来简化这个式子. 因为len(n)是一个变量,而且表示比较复杂.因此只需要将n分成几段,比如1-9,10-99这些位数相同的区间. 观察一下式子,里面有f[n],f[n-1],n这些变量,10a这个常量. 假设现在有这么一个矩

BZOJ 3236: [Ahoi2013]作业

题目 3236: [Ahoi2013]作业 Time Limit: 100 Sec  Memory Limit: 512 MBSubmit: 732  Solved: 271 Description Input Output Sample Input 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 Sample Output 2 2 1 1 3 2 2 1 HINT N=100000,M=1000000 Source By wangyisong1996加强数据

BZOJ 3379: [Usaco2004 Open]Turning in Homework 交作业

Description 贝茜有C(1≤C≤1000)门科目的作业要上交,之后她要去坐巴士和奶牛同学回家. 每门科目的老师所在的教室排列在一条长为H(1≤H≤1000)的走廊上,他们只在课后接收作业.交作业不需要时间.贝茜现在在位置0,她会告诉你每个教室所在的位置,以及走廊出口的位置.她每走1个单位的路程,就要用1秒.她希望你计算最快多久以后她能交完作业并到达出口. Input 第1行输入三个整数C,H,B,B是出口的位置.之后C行每行输入两个整数,分别表示一个老师所在的教室和他的下课时间. Ou