zoukankan      html  css  js  c++  java
  • 【2018.10.2】纸条

    【题目描述】

    纸上有一排数,共 $n$ 个。数与数之间的间距是相同的,从左到右第 $i$ 个数为 $A_i$ 。
    你有 $k$ 个长度为 $w$ 的纸条,每个纸条最多可以覆盖连续 $w$ 个数。我们需要求出被覆盖的数的总和最大是多少。
    其中:纸条可以重叠,一个数被覆盖多次只算一次。纸条可以折叠后使用,即不要求纸条一定要覆盖 $w$ 个数,可以覆盖小于 $w$ 个的数。纸条也不用全部都被用上。

    【输入格式】

    从文件 paper.in 中读入数据。
    第一行 $3$ 个整数 $n,k,w$,分别表示数的个数、纸条的长度和纸条数量。
    第二行 $n$ 个整数,第 i 个数表示 $A_i$ 。

    【输出格式】

    输出到文件 paper.out 中。
    输出一行一个整数,表示被覆盖的数的总和的最大值。

    【样例 1 输入】

    9 2 3
    2 8 5 1 9 6 9 3 2

    【样例 1 输出】

    39
    【样例 2 输入】

    5 4 3
    1 -1 -1 -1 1

    【样例 2 输出】

    2


     第一眼可以想到一个$O(nkw)$的dp:dp[i][j] 表示在第 1~i 个数中,用了 j 张纸条时能覆盖到的最大和。

     转移方程就是 $dp[i][j]=max(dp[k][j-1]+sum[i]-sum[k])=max(dp[k][j-1]-sum[k])+sum[i]$ $|$ $i-k<=k<i$ 其中sum[i]表示第 1~i 个数的和

     然后发现只设了两维状态,却多了一层循环,那层循环干嘛用的?

     一看,对于不同的纸条数 j,取前k位 dp值减去分数前缀和 的最大值……

     所以这不是用 k 个单调队列优化的dp裸题么……

     时间复杂度$O(nk)$。

  • 相关阅读:
    C#关于MSMQ通过HTTP远程发送专有队列消息的问题
    ASP.NET中进行消息处理(MSMQ) 三
    ASP.NET中进行消息处理(MSMQ) 二
    ASP.NET中进行消息处理(MSMQ) 一
    日志插件 log4net 的使用
    在64位windows下使用instsrv.exe和srvany.exe创建windows服务
    Windows下MemCache多端口安装配置
    把页面上DIV元素生成图片
    memcached协议
    没钱买珍珠首饰,能够画一个
  • 原文地址:https://www.cnblogs.com/scx2015noip-as-php/p/9737369.html
Copyright © 2011-2022 走看看