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)$。

  • 相关阅读:
    BZOJ1430小猴打架——prufer序列
    [集训队作业2018]蜀道难——TopTree+贪心+树链剖分+链分治+树形DP
    BZOJ5063旅游——非旋转treap
    bzoj 4570 妖怪
    Luogu 1452 Beauty Contest
    bzoj 1337 最小圆覆盖
    bzoj 1007 水平可见直线
    Luogu 4724 三维凸包
    bzoj 4827 礼物
    hdu 4348 To the moon
  • 原文地址:https://www.cnblogs.com/scx2015noip-as-php/p/9737369.html
Copyright © 2011-2022 走看看