zoukankan      html  css  js  c++  java
  • 葡萄

    题目描述

    狐狸来到了葡萄架下,葡萄架下有一排n串葡萄,他想将一部分葡萄偷走。

    每个葡萄都有一个美味值,当然因为葡萄有甜有酸,美味值也有正有负。

    为了不让农夫发现,狐狸决定,每连续的k串葡萄中,最多偷走b串,但是由于狐狸太贪心,所以每连续的k串葡萄中,它最少偷走a串。

    由于狐狸对农夫怀恨在心,它希望自己偷走的葡萄的美味值总和减掉剩余的葡萄的美味值总和最大。请你帮助它求出这个最大值。

    数据范围:对于100%的数据,n<=10^4,0<=a<=b<=k<=10,|美味值|<=10^4

    解法

    状压DP。n<=10^4,无法状压,然而k<=10,从k下手。
    因为要使偷走的葡萄的美味值总和减掉剩余的葡萄的美味值总和最大,所以偷走的葡萄的美味值总和应尽量大。
    设$f[i][S]$表示前i串葡萄的倒数k串在状态S下最大的偷走葡萄的美味值(第i串称为c[i])。
    则有方程:f[i+1][S<<1]=max(f[i][S])
    f[i+1][S<<1|1]=max(f[i][S])+c[i]
    可预判一个状态是否合法。但如果这样判断:
    void check()
    {
        int cnt;
        for(int i=0;i<zt;++i)
            cnt=count1(i),ok[i]=(a<=cnt&&cnt<=b)?1:0;
    }

    那S左移后将有问题。所以S<<1改为(S<<1)&(zt-1)。(zt是状态数量,等于2^k)

    答案为$max(f[n][T])(Tin$合法集合$)$。初始化$f[0][$所有状态$]=0$,其它为$-infty$。

  • 相关阅读:
    HDU 2116 Has the sum exceeded
    HDU 1233 还是畅通工程
    HDU 1234 开门人和关门人
    HDU 1283 最简单的计算机
    HDU 2552 三足鼎立
    HDU 1202 The calculation of GPA
    HDU 1248 寒冰王座
    HDU 1863 畅通工程
    HDU 1879 继续畅通工程
    颜色对话框CColorDialog,字体对话框CFontDialog使用实例
  • 原文地址:https://www.cnblogs.com/xzs123456/p/11003279.html
Copyright © 2011-2022 走看看