首页 > 其他分享 >CF946D Timetable(动态规划)

CF946D Timetable(动态规划)

时间:2023-01-17 23:11:06浏览次数:48  
标签:哪些 CF946D len int Timetable 动态 代价 dp

Timetable

题意:

给出 \(n\) 行 \(m\) 列 \(01\) 串,对于每一行所要花费的代价是行中第一个 \(1\) 和最后一个 \(1\) 之间的距离加一,现在你有魔法可以去除掉 \(k\) 个 \(1\),问去掉不多于 \(k\) 个 \(1\) 的情况下,你所能获得的最小代价是多少。

思路:

看到有 \(k\) 次限制求最小代价,不难想到需要用到 \(DP\) 来解决,不妨考虑设状态 \(dp[i][j]\) 表示在前 \(i\) 个串中逃了 \(j\) 次课最少的上课时间是多少。那么就可以将逃了多少次课视作一个物品的容量,每一天上课的时间看作是物品的价值,这样就转化成了一个背包问题。但是每一天到底哪些课要逃,哪些课不逃不太好处理,所以需要对每一天做一个预处理。
定义一个数组 \(v[i][j]\) 表示第 \(i\) 天翘了 \(j\) 节课的最小代价,因为题目说了,一天的在校时间是最后一节课的时间减去第一节课的时间,所以只有逃首尾两端的课才可以让贡献变小,那么只需要去 \(O\left(n ^ 2\right)\) 的循环计算一下中间要上哪些课就可以了

    memset(v, 0x3f, sizeof v);
    for (int i = 1; i <= n; i++) {
        string s;
        cin >> s;
        int len = 0;
        for (int j = 0; j < m; j++) {
            if (s[j] & 1) a[++len] = j + 1;  //记录哪些时间段有课
        }
        
        v[i][len] = 0;
        siz[i] = len;
        for (int j = 1; j <= len; j++) 
            for (int k = j; k <= len; k++) 
                v[i][len - (k - j + 1)] = min(v[i][len - (k - j + 1)], a[k] - a[j] + 1);  //中间要上课的时间
    }

之后就是一个基础的背包转移

    memset(dp, 0x3f, sizeof dp);
    for (int i = 0; i <= p; i++) dp[0][i] = 0;
 
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j <= p; j++) {
            for (int k = 0; k <= min(j, siz[i]); k++) {
                dp[i][j] = min(dp[i][j], dp[i - 1][j - k] + v[i][k]);
            }
        }
    }
 
    printf("%d\n", dp[n][p]);

标签:哪些,CF946D,len,int,Timetable,动态,代价,dp
From: https://www.cnblogs.com/Haven-/p/17058896.html

相关文章

  • 【动态规划】高楼扔鸡蛋问题
    目录高楼扔鸡蛋题目方法一:动态规划分析边界条件状态转移代码实现复杂度方法二分析高楼扔鸡蛋这是一个比较经典的动态规划问题,最先来自谷歌的面试题。题目887.鸡蛋掉落......
  • jQuery(自定义动画/导航动态显示效果)
    视频自定义动画<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>24_自定义动画</title><styletype="text/css">*{margin:0px;......
  • BLE动态广播与连接
    一、动态广播内容动态修改广播包需要对广播包里面的数据进行重新赋值即可。通过TMOS任务处理。if(events&DYNAMIC_advertData)//动态广播包内容{......
  • Linux环境中动态库文件(.so文件)的realname,soname和linkname
     realname:实际等同于库文件的filename,是在库文件生成时就被指定的,如:gcc-shared-o$(realname)dependenceflagsrealname的一般格式为lib$(name).so.$(major).$(......
  • Linux动态库soname的使用
    通过一个简单的例子,体验一下Linux动态库soname的使用。假设有一个动态库:libbar.so.1.1.0,其对应的三个名称如下。realname:libbar.so.1.1.0soname:libbar.so.1linkname:l......
  • Linux动态链接库.so文件的命名及用途总结
    我们在linux下开发项目,有时会对外提供动态库,像***.so.1.0.0这样子的文件,另外提供相应的头文件。用户拿到动态库和头文件说明,就可以使用动态库里的function。那随之而来......
  • React: 动态添加样式
    问题背景在软件开发过程中,经常会出现动态添加style或className,比如:同一个表格组件在A处调用,需要固定前四列数据,B处调用则不用,那这时候,动态添加元素就派上了用场。解决方......
  • JPA动态注册多数据源
    背景目前已经是微服务的天下,但是随着业务需求的日益增长,部分应用还是出现了需要同时连接多个数据源操作数据的技术诉求。需要对现有的技术架构进行优化升级,查阅了下网上......
  • CAD动态块操作实例:绘制剖面符号
    CAD动态块与普通的CAD图块相比,其图形夹点更多,设计师可以利用动态块的夹点对图形进行快速调整,自由拉伸长度、随心切换隐藏形态等。本节,给大家分享一下浩辰CAD软件中利用CAD......
  • ABAP Memory Inspector 里对动态内存对象的内存消耗度量方式
    ABAP静态内存对象是其大小在设计时由数据类型声明设置的对象。除非更改程序代码本身,否则程序中此类变量占用的内存不会更改。在ABAP术语中,静态变量也称为flatvariab......