葡萄 状压DP

来源:互联网 发布:法国留学知乎 编辑:程序博客网 时间:2024/05/16 21:27

葡萄

问题描述

葡萄架上有n 串葡萄,每串葡萄都有一个价值。有一只狐狸想偷走一些。
不过她规定,任意连续的k 串葡萄中,最多选b 串,最少选a 串。
现在,狐狸要选出一些葡萄,使得狐狸得到的葡萄的价值和,与剩余葡萄的
价值的和,差值最大。

输入格式

第一行四个整数n,k,a,b
一行N 个整数表示每串葡萄的价值

输出格式

一个整数表示答案

样例输入

2 1 0 1
2 -2

样例输出

4

提示

得到第一串得到的价值和是2
剩余的价值和是-2
差值为4
对于20%:n<=10
对于另外20%:a=0,b=k
对于100%:n<=1000,0<=a<=b<=k<=10 ,k <= n 所有葡萄的价值的绝对值<=10^9


设狐狸选的葡萄价值总和为sel,所有葡萄价值总和为tot,那么答案是sel(totsel)=2seltot,所以我们需要让sel尽可能大。再加上本题的n不大,阶段性也很明显,考虑DP。

如何满足“任意连续的k 串葡萄中,最多选b 串,最少选a 串”,注意到k的范围特别小,这启发我们用状态压缩。定义f[i][S]表示当前讨论到第i位,最后k串葡萄的选择情况为S的最大选择总值。那么状态转移就很显然了:当前这串葡萄选还是不选。转移时判断状态是否合法即可。每个状态选了多少个数可以预处理出来,时间复杂度O(n2k)


代码:

#include<stdio.h>#include<cstring>#include<algorithm>#define ll long long#define MAXN 1234using namespace std;int N,K,A,B,U,Cnt[MAXN];ll f[MAXN][MAXN],V[MAXN];int GetCnt(int x){    int cnt=0;    while(x)x^=(x&-x),cnt++;    return cnt;}int main(){    int i,j,t;    ll x,sel=0,tot=0;    scanf("%d%d%d%d",&N,&K,&A,&B);    for(i=1;i<=N;i++)scanf("%lld",&V[i]),tot+=V[i];    memset(f,-60,sizeof(f));    U=(1<<K)-1;    f[0][0]=0;    for(i=0;i<=U;i++)Cnt[i]=GetCnt(i);    for(i=0;i<N;i++)    for(j=0;j<=U;j++)    {        if(i>=K&&(Cnt[j]<A||Cnt[j]>B))continue;        t=j<<1&U;        if(!(i+1>=K&&(Cnt[t]<A||Cnt[t]>B)))f[i+1][t]=max(f[i][j],f[i+1][t]);        t|=1;        if(!(i+1>=K&&(Cnt[t]<A||Cnt[t]>B)))f[i+1][t]=max(f[i][j]+V[i+1],f[i+1][t]);    }    for(i=0;i<=U;i++)if(Cnt[i]>=A&&Cnt[i]<=B)sel=max(sel,f[N][i]);    printf("%lld",sel*2-tot);}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 萝卜咸菜盐咸了怎么办 吃了蚕蛹身上痒怎么办 玉米没煮熟吃了怎么办 新鲜核桃吃多了怎么办 吃了发霉的核桃怎么办 拔牙后肿的厉害怎么办 拨牙之后脸肿怎么办 种牙之后脸肿了怎么办 鼻子放假体老了怎么办 鸡蛋吃多过敏了怎么办 想把衣服换颜色怎么办 衣服用84洗坏了怎么办 衣服用84洗花了怎么办 衣服用84洗黄了怎么办 白色衣服用84漂黄了怎么办 84把衣服泡黄了怎么办 84把衣服洗花了怎么办 衣服用84洗掉色怎么办 被84褪色的衣服怎么办 衣服被84烧红了怎么办 84溅到衣服上边怎么办 84把衣服泡花了怎么办 衣服颜色洗旧了怎么办 蒙版画笔用不了怎么办 眼睛小血管破裂出血怎么办 雅漾喷头坏了怎么办 一夜都是浅睡眠怎么办 注塑机合不了膜怎么办 吸了塑料烧焦味怎么办 热熔的管漏水怎么办 45岁了月经不来怎么办 吃了芒果身上痒怎么办 10个月宝宝上火怎么办 1个月的宝宝上火怎么办 2个月的婴儿上火怎么办 1岁宝宝不吃奶粉怎么办 奶水不够宝宝又不吃奶瓶怎么办 13岁脸上长粉刺怎么办 脸敷面膜过敏了怎么办 婴儿面膜是假的怎么办 一贴面膜就过敏怎么办