葡萄 状压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
设狐狸选的葡萄价值总和为
如何满足“任意连续的k 串葡萄中,最多选b 串,最少选a 串”,注意到k的范围特别小,这启发我们用状态压缩。定义
代码:
#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);}
阅读全文
0 0
- 葡萄 状压DP
- 2017NOIP模拟赛 葡萄(状压DP)
- 葡萄奶昔
- 葡萄(水果)
- 葡萄(水果)
- 田寨村葡萄
- 吃葡萄不吐葡萄皮
- 吃葡萄不吐葡萄皮
- 葡萄剥皮儿
- 葡萄美酒夜光杯
- 葡萄还未下架已赚几百万
- 江心洲摘葡萄
- 第十四届葡萄学术研讨会
- 高山葡萄基地
- 营养百科之葡萄
- 葡萄成熟时
- 王葡萄的爱情
- 葡萄皮1
- 第10周项目1(4)-哈夫曼编码的算法验证
- 浏览器内核及分类
- python中利用Time模块判断输入年月日为该年第几天
- re模块:findall()
- 文章标题
- 葡萄 状压DP
- java-网络编程
- 2016NOIP普级组第一题--买铅笔(参考洛谷题解)
- MyBatis学习笔记(4)—— XML映射文件の结果集(Result Maps)高级结果映射中的集合(collection)
- Python的post请求josn格式参数
- FHost ‘192.168.21.70’ is not allowed to connect to this MySQL serverConnection closed by foreign hos
- 详解JAVA垃圾回收机制
- 装饰模式
- 关于 Goroutine 的一些使用细节