题意

n天的课程,每天有m个时间单位.若时间i和j都有课,那么要在学校待\(j-i+1\)个时间.现在最多能翘k节课,问最少能在学校待多少时间.

分析

将一天的内容视作一个背包的组,可以预处理出该天内翘k节课能得到的最多空闲时间.\(val[i][k]\)表示第i天中翘k节课能够获取最多的时间,暴力枚举左右分别翘\(p\)和\(k-p\)节课,取最大值.这样相当于得到了每个组内的物品重量(翘的课数)和价值(得到的空闲时间).再做一次分组背包求出能获得的最大空闲时间,用总的时间减去得到最少要待在学校的时间.

  1. #include<bits/stdc++.h>
  2. #define PII pair<int,int>
  3. #define MP make_pair
  4. #define X first
  5. #define Y second
  6. using namespace std;
  7. const int maxn = 1e3+5;
  8. const int INF = 0x3f3f3f3f;
  9. char str[maxn];
  10. vector<int> pos[maxn];
  11. int val[maxn][maxn], dp[maxn][maxn];
  12. int main()
  13. {
  14. #ifndef ONLINE_JUDGE
  15. freopen("in.txt", "r", stdin);
  16. freopen("out.txt", "w", stdout);
  17. #endif
  18. int n, m ,W;
  19. scanf("%d %d %d",&n, &m, &W);
  20. for(int i=1;i<=n;++i){
  21. scanf("%s",str+1);
  22. for(int j=1; j<=m; ++j){
  23. if(str[j]=='1') pos[i].push_back(j);
  24. }
  25. }
  26. for(int i = 1;i<=n; ++i){
  27. int sz = pos[i].size();
  28. if(sz==0) {
  29. val[i][0] = m;
  30. continue;
  31. }
  32. for(int j = 0; j <= min(W,sz); ++j){
  33. int cnt = INF;
  34. if(j==sz){
  35. val[i][sz] = m;
  36. break;
  37. }
  38. for(int L = 0, R; L <= j; ++L ){
  39. R = sz - (j - L) - 1;
  40. cnt = min(cnt,pos[i][R] - pos[i][L]+1);
  41. }
  42. val[i][j] = m - cnt;
  43. }
  44. }
  45. for(int i = 1; i <= n ;++i){
  46. int sz = pos[i].size();
  47. for(int k = 0; k <= sz;++k){
  48. for(int j = W; j>= k; --j){
  49. dp[i][j] = max(dp[i][j], dp[i-1][j-k]+ val[i][k]);
  50. }
  51. }
  52. }
  53. printf("%d\n",n*m-dp[n][W]);
  54. return 0;
  55. }

CodeForces - 946D Timetable (分组背包+思维)的更多相关文章

  1. 2018.12.08 codeforces 946D. Timetable(背包)

    传送门 题意简述:有一个人上n天课,每天有m个小时的时间安排表(一个01串),为1表示要上课,否则不上课,求出如果可以最多翘kkk节课这nnn天在校待的总时间的最小值(一天必须在所有课上完后才能离开) ...

  2. Codeforces 946D - Timetable (预处理+分组背包)

    题目链接:Timetable 题意:Ivan是一个学生,在一个Berland周内要上n天课,每天最多会有m节,他能逃课的最大数量是k.求他在学校的时间最小是多少? 题解:先把每天逃课x节在学校呆的最小 ...

  3. Codeforces 946D Timetable(预处理+分组背包)

    题目链接:http://codeforces.com/problemset/problem/946/D 题目大意:有n个字符串,代表n天的课表,1表示这个时间要上课,0表示不要上课,一天在学校时间为第 ...

  4. Timetable CodeForces - 946D (预处理+背包)

    题意:n天m节课,最多可以逃k节课,每天在学校待的时间为该天上的第一节课到最后一节课持续的时间.问怎样逃课可以使这n天在学校待的时间最短,输出最短的时间. 分析: 1.预处理出每天逃j节课时在学校待的 ...

  5. codeforces 864 E. Fire(背包+思维)

    题目链接:http://codeforces.com/contest/864/problem/E 题解:这题一看就很像背包但是这有3维限制也就是说背包取得先后也会对结果有影响.所以可以考虑sort来降 ...

  6. [Codeforces 946D]Timetable

    Description 题库链接 给你一个 \(N\times M\) 的 \(01\) 矩阵,你可以从中将一些 \(1\) 变为 \(0\) ,最多 \(K\) 次.使操作之后使得每行最远的 \(1 ...

  7. CodeForces 946D Timetable (DP)

    题意:给定 n,m,K,表示某个人一个周有 n 天,每天有 m 节课,但是他可以跳过 K 节课,然后下面每行一个长度为 m 个01字符串,0 表示该人在这一小时没有课,1 表示该人在这一个小时有课,每 ...

  8. #分组背包 Educational Codeforces Round 39 (Rated for Div. 2) D. Timetable

    2018-03-11 http://codeforces.com/contest/946/problem/D D. Timetable time limit per test 2 seconds me ...

  9. Codeforces 946 D.Timetable-数据处理+动态规划(分组背包) 处理炸裂

    花了两个晚上来搞这道题. 第一个晚上想思路和写代码,第二个晚上调试. 然而还是菜,一直调不对,我的队友是Debug小能手呀(真的是无敌,哈哈,两个人一会就改好了) D. Timetable   tim ...

随机推荐

  1. 23种设计模式之状态模式(State)

    状态模式是一种对象的行为型模式,允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类.状态模式封装了状态的转换过程,但是它需要枚举可能的状态,因此,需要事先确定状态种类,这也导致在状 ...

  2. 经典把妹桥段:Flower dance开头对话

    听到一首很赞的钢琴曲,Flower Dance,其开头有一段英文对话,如下: Lucy:"They serve the purpose of changing hydrogen into b ...

  3. 最长回文 HDU - 3068 manacher 模板题

    题意:找串的最长回文字串(连续) 题解:manacher版题 一些理解:首位加上任意两个字符是为了判断边界. 本算法主要是为了 1.省去奇偶分类讨论. 2.防止形如aaaaaaa的串使得暴力算法蜕化为 ...

  4. CCCC L2-002. 链表去重

    https://www.patest.cn/contests/gplt/L2-002 模拟一个链表的去重操作 题解:别模拟了,直接用内置的list和map.关于输出的地址,直接用pair存地址和值,输 ...

  5. python面向对象高级:__slots__

    __slots__ 一个在有着数以千计的对象的类的时候节省内存的方法. 在Python中,每个类都有实例属性.默认情况下Python用一个字典来保存一个对象的实例属性.这非常有用,因为它允许我们在运行 ...

  6. JIRA licence and vulnarability,jenkins,devops

    http://blog.itpub.net/13651903/viewspace-1079918/ http://www.freebuf.com/articles/web/34051.html JIR ...

  7. JS继承封装

    <script> var extend = function (subClass, superClass) { //1.继承类的中间类 var Tmp = function() {}; / ...

  8. linux环境下python的部署

    linux系统环境自带python2.6,但有时我们项目使用的版本可能是3.x以上等等,此时我们需要在linux中再安装项目所需的python版本,此时就涉及多版本共存问题了,很多同学在安装多个版本P ...

  9. django时间的时区问题

    在用django1.8版本做项目的时候遇到时间的存储与读取不一致的问题,网上找了很多帖子,但都没有讲明白.本文将在项目中遇到的问题及如何解决的尽可能详细的记录下来,当然本文参考了网上大量相关文章. 在 ...

  10. JAVA中只有值传递

    今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:“引用传递!”,并且还觉得自己对java的这 ...