ACM-ICPC 2018 南京赛区网络预赛丨AC Challenge丨状压DP
题意:
一个人做n道题目,每道题会收获ai*t+bi的分数,同时要休息一个单位的时间t。此外,还限制做题目i之前,要先完成si道题目{pi1,pi2,···,pisi}求最多获得多少分数。
思路:
n的范围只有20,这就暗示可以状压,(我一开始想到了拓扑排序,然后发现建不了图的),状压以后就可以DP求答案了。用二进制来表示做题的状态,我们举例子:
对于状态:1001101
表示做了题目:1-3-4-7
这可以由以下四种状态转移来(假如没有限制的话):
1001100 + 0000001
1001001 + 0000100
1000101 + 0001000
1001101 + 1000000
以第一个为例,就是从做的3-4-7题目状态的基础上,做了题目1转移来。
于是对于每个状态,我们枚举每一个二进制位,再判断这一位前个状态是否能满足对应题目的条件。转移就是计算权值,求个最大值。至于t的数值是多少,显然就是二进制里1的个数啦!
参考代码:
(细节要注意初始化成负无穷,因为a的值可能是负数,所以存在某些情况,先做一道亏损的题目,后续会使得更多的高分题目可做)
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
typedef long long ll;
const int N = 21;
ll dp[1<<N],ans;
int a[N],b[N],pre[N];int Count1(int x){int res=0;for(int i=0;i<N;i++)if(x&(1<<i))res++;return res;
}int main(){int n;scanf("%d",&n);for(int i=0,s;i<n;i++){scanf("%d%d%d",a+i,b+i,&s);for(int j=1,p;j<=s;j++){scanf("%d",&p);pre[i]+=1<<(p-1);}}memset(dp,0x80,sizeof dp);//初始化负数极小的简单方法dp[0]=0;int FState=(1<<n)-1;for(int i=1;i<=FState;i++)for(int j=0,u,v;j<n;j++){if(!(i&(1<<j)))//i状态没有做第j题continue;u=i-(1<<j);if((u&pre[j])!=pre[j])//i状态除去j题的状态不满足j题的条件continue;ll w=dp[u]+a[j]*Count1(i)+b[j];ans=max(dp[i]=max(dp[i],w),ans);}printf("%lld\n",ans);return 0;
}
/*
5
5 6 0
4 5 1 1
3 4 1 2
2 3 1 3
1 2 1 4
*/
ACM-ICPC 2018 南京赛区网络预赛丨AC Challenge丨状压DP相关推荐
- ACM-ICPC 2018 南京赛区网络预赛 E AC Challenge(状压dp)
Dlsj is competing in a contest with n (0 < n \le 20)n(0<n≤20) problems. And he knows the answe ...
- ACM-ICPC 2018 南京赛区网络预赛 E. AC Challenge(状压dp)
题目链接:https://nanti.jisuanke.com/t/30994 样例输入1 5 5 6 0 4 5 1 1 3 4 1 2 2 3 1 3 1 2 1 4 样例输出1 55 样例输入2 ...
- ACM-ICPC 2018 南京赛区网络预赛 E. AC Challenge
题解 题目大意 给你n个问题 要求每分钟解决一个问题 且不能中断 如果中断当前得分为最终得分 每个问题的得分为 解决时间*a[i] + b[i] 有的问题需要先完成某些问题才能做 使用状压DP 用二进 ...
- ACM-ICPC 2018 南京赛区网络预赛 J AC Challenge (状压dp)
题意 给你n道题,在你做第ii{i}道题的时候有p[j]p[j]{p[j]}个前置条件,当这些前置条件都满足的时候,我们可以得到a[j]∗t+b[j]a[j]∗t+b[j]a[j] * t + b[j ...
- ACM-ICPC 2018 南京赛区网络预赛 E AC Challenge
题目链接:https://nanti.jisuanke.com/t/30994 题意:有n道题,做第i道题首先得做Si道题(p1,p2,...,psi),做一道题需要一分钟,在t时刻完成第i道 ...
- ACM-ICPC 2018 南京赛区网络预赛 E AC Challenge 状压DP
题目链接: https://nanti.jisuanke.com/t/30994 Dlsj is competing in a contest with n (0 < n \le 20)n(0& ...
- ACM-ICPC 2018 南京赛区网络预赛 E.AC Challenge 状压dp
题意: 给定n个作业,每个作业有两个值a,b, 第i天完成这个作业会得到value :i*a + b: 但是完成这个任务之前需要完成一些别的任务 思路: 乍一看像是搜索,但是似乎不太行(好像可以写过) ...
- ACM-ICPC 2018 南京赛区网络预赛 E. AC Challenge 状压dp
Dlsj is competing in a contest with n(0<n≤20)n (0 < n \le 20)n(0<n≤20) problems. And he kno ...
- ACM-ICPC 2018 南京赛区网络预赛
轻轻松松也能拿到区域赛名额,CCPC真的好难 An Olympian Math Problem 问答 只看题面 54.76% 1000ms 65536K Alice, a student of gra ...
- ACM-ICPC 2018 南京赛区网络预赛 Lpl and Energy-saving Lamps 线段树
目录 ACM-ICPC 2018 南京赛区网络预赛 Lpl and Energy-saving Lamps 线段树 题面 题意 思路 ACM-ICPC 2018 南京赛区网络预赛 Lpl and En ...
最新文章
- Java、Android静态代理与动态代理
- 【转载】使用Nexus搭建Maven服务器详细配置
- 【C++】35.判断一个文件是否存在、 查找字符串中的子串
- 读DL论文心得之SPP
- .NET Framework 类库: Uri类
- linux 挂载多余空间,linux 空间不够,磁盘挂载
- python 查找算法_七大查找算法(Python)
- spring 集成mybatis——多数据源切换(附带定时器的配置)
- 3.3、苏宁百万级商品爬取 代码讲解 商品爬取
- 【HAVENT原创】NodeJS 短网址开发(调用第三方接口)
- matlab实验 信号处理,数字信号处理MATLAB实现与实验
- 科研热点|中科院文献情报中心:2022分区表即将发布,这几大变化值得关注~
- Daily errors about log encoding and web page garbled characters
- Swift --- 扩展(Extention)
- 通达信地量指标公式 启涨地量买点选股指标天眼地量指标
- python快速入门精讲_Python快速入门精讲
- Java数据结构-图
- 放纵如山倒,自律如抽丝
- [JVM]虚拟机类加载机制
- 软件测试 - 缺陷管理篇