Dlsj is competing in a contest with n (0 < n \le 20)n(0<n≤20) problems. And he knows the answer of all of these problems.

However, he can submit ii-th problem if and only if he has submitted (and passed, of course) s_isi​ problems, the p_{i, 1}pi,1​-th, p_{i, 2}pi,2​-th, ......, p_{i, s_i}pi,si​​-th problem before.(0 < p_{i, j} \le n,0 < j \le s_i,0 < i \le n)(0<pi,j​≤n,0<j≤si​,0<i≤n) After the submit of a problem, he has to wait for one minute, or cooling down time to submit another problem. As soon as the cooling down phase ended, he will submit his solution (and get "Accepted" of course) for the next problem he selected to solve or he will say that the contest is too easy and leave the arena.

"I wonder if I can leave the contest arena when the problems are too easy for me."
"No problem."
—— CCF NOI Problem set

If he submits and passes the ii-th problem on tt-th minute(or the tt-th problem he solve is problem ii), he can get t \times a_i + b_it×ai​+bi​ points. (|a_i|, |b_i| \le 10^9)(∣ai​∣,∣bi​∣≤109).

Your task is to calculate the maximum number of points he can get in the contest.

Input

The first line of input contains an integer, nn, which is the number of problems.

Then follows nn lines, the ii-th line contains s_i + 3si​+3 integers, a_i,b_i,s_i,p_1,p_2,...,p_{s_i}ai​,bi​,si​,p1​,p2​,...,psi​​as described in the description above.

Output

Output one line with one integer, the maximum number of points he can get in the contest.

Hint

In the first sample.

On the first minute, Dlsj submitted the first problem, and get 1 \times 5 + 6 = 111×5+6=11 points.

On the second minute, Dlsj submitted the second problem, and get 2 \times 4 + 5 = 132×4+5=13points.

On the third minute, Dlsj submitted the third problem, and get 3 \times 3 + 4 = 133×3+4=13 points.

On the forth minute, Dlsj submitted the forth problem, and get 4 \times 2 + 3 = 114×2+3=11 points.

On the fifth minute, Dlsj submitted the fifth problem, and get 5 \times 1 + 2 = 75×1+2=7 points.

So he can get 11+13+13+11+7=5511+13+13+11+7=55points in total.

In the second sample, you should note that he doesn't have to solve all the problems.

样例输入1复制

5
5 6 0
4 5 1 1
3 4 1 2
2 3 1 3
1 2 1 4

样例输出1复制

55

样例输入2复制

1
-100 0 0

样例输出2复制

0

题目来源

ACM-ICPC 2018 南京赛区网络预赛

题意:给你n(n<=20)门课,每门课需要1单位时间学习。每门课有k门前置课程。(学完所有前置课程才能学这门课)你在第t单位学习了第i门课,将会获得收益a[i]*t+b[i](|a|,|b|<=1e9)。你可以最多学习n门课,求能获得的最大收益(全都不学收益为0)。

思路:一眼过去就是状压dp啊。。。这两天刚复习完状压dp,没有犹豫,拿到这题迅速就1A了。

n比较小,直接二进制表示哪门课做了没做。

对于状态i,若(i&(1<<j)) ==1 就可以枚举当前要学习这第j+1门课了。tmp=i^(1<<j)表示没学这门课的状态(不合法跳过)。

然后看tmp|c[j]是否==tmp即可。(c[j]为前置课程的二进制形式),然后dp取最大值就行了。

代码:

#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<string>
#include<queue>
#include<vector>
#include<map>
#include<set>
#define ll long long
using namespace std;
const int mo=1e9+7;
const int maxn=1<<20;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
int n,m,k,T;
ll dp[maxn],ans,tmp,sum;
ll a[25],c[25],b[25];
ll fcount(int x)
{ll s=0;while(x){s++;x&=(x-1);}return s;
}
int main() {int T;while(scanf("%d",&n)!=EOF){ans=0;sum=0;for(int i=0;i<n;i++){scanf("%lld%lld%d",&a[i],&b[i],&k);c[i]=0;for(int j=0;j<k;j++){int x;scanf("%d",&x);x--;c[i]|=(1<<x);}}m=1<<n;for(int i=0;i<m;i++)dp[i]=-inf;//数据水了,这里改成-1也能过,实际上-1不一定不合法dp[0]=0;for(int i=1;i<m;i++){for(int j=0;j<n;j++)if(i&(1<<j)){int tmp=i^(1<<j);if(dp[tmp]==-inf)continue;if((tmp|c[j])==tmp){ll t=fcount(i);ans=max(ans,dp[i]);dp[i]=max(dp[i],dp[tmp]+a[j]*t+b[j]);ans=max(ans,dp[i]);}}}printf("%lld\n",ans);}return 0;
}

ACM-ICPC 2018 南京赛区网络预赛 E AC Challenge(状压dp)相关推荐

  1. 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 ...

  2. 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& ...

  3. ACM-ICPC 2018 南京赛区网络预赛 E.AC Challenge 状压dp

    题意: 给定n个作业,每个作业有两个值a,b, 第i天完成这个作业会得到value :i*a + b: 但是完成这个任务之前需要完成一些别的任务 思路: 乍一看像是搜索,但是似乎不太行(好像可以写过) ...

  4. 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 ...

  5. ACM-ICPC 2018 南京赛区网络预赛 E. AC Challenge

    题解 题目大意 给你n个问题 要求每分钟解决一个问题 且不能中断 如果中断当前得分为最终得分 每个问题的得分为 解决时间*a[i] + b[i] 有的问题需要先完成某些问题才能做 使用状压DP 用二进 ...

  6. ACM-ICPC 2018 南京赛区网络预赛 E AC Challenge

    题目链接:https://nanti.jisuanke.com/t/30994 题意:有n道题,做第i道题首先得做Si道题(p1​,p2​,...,psi​​),做一道题需要一分钟,在t时刻完成第i道 ...

  7. 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 ...

  8. ACM-ICPC 2018 南京赛区网络预赛丨AC Challenge丨状压DP

    题意: 一个人做n道题目,每道题会收获ai*t+bi的分数,同时要休息一个单位的时间t.此外,还限制做题目i之前,要先完成si道题目{pi1,pi2,···,pisi}求最多获得多少分数. 思路: n ...

  9. ACM-ICPC 2018 南京赛区网络预赛

    轻轻松松也能拿到区域赛名额,CCPC真的好难 An Olympian Math Problem 问答 只看题面 54.76% 1000ms 65536K Alice, a student of gra ...

最新文章

  1. 关于学习Python的一点学习总结(25->pass占位符)
  2. 对象数组空指针异常说明——C#中使用对象数组必须分别为其开辟空间
  3. NASM汇编helloworld图解
  4. three ways for reducing the level of anxiety
  5. java 线程 通过interrupted_分析Java线程中断机制stop和interrupted的用法
  6. java并发编程之美-阅读记录3
  7. gcc对C语言的扩展:语句内嵌表达式(statement-embedded expression)
  8. 对fgets的理解1
  9. js undefined 相等_你知道JS中==和===区别吗?
  10. 实现点击打卡_打卡APP哪家强?快来看!这里有一款超好用的轻量级免费的习惯养成APP!...
  11. 模拟太阳系的html,纯HTML5制作的震撼太阳系网页
  12. 记录一下不能使用let时如何创建局部变量(使用立即执行函数)
  13. java中方法的_Java中的常用方法
  14. 数据中心监控软件 - ManageEngine OpManager
  15. js-ramda-介绍和对比lodash及补集库
  16. PL-SLAM:通过点和线段组合的立体SLAM系统
  17. 太极图php代码,如何实现太极图
  18. 北上广深也不相信口水
  19. 最小二乘解(Least-squares Minimization )
  20. oracle 索引命中条件,Oracle索引命中与扫描规律总结 | 学步园

热门文章

  1. dotnet夜话 第六、七集笔记
  2. 算法的特性和设计要求
  3. 终极合体!谷歌大脑DeepMind正式联姻,1+1>OpenAI?
  4. Linux基础、命令及相关软件安装
  5. python中函数的作用不包括_Python 列表不包含了以下哪个内置函数( )_财经法规答案_学小易找答案...
  6. 差异表达基因热图怎么看_为什么我代码里面选择top1000的sd基因绘制热图呢
  7. SkipList(跳表)
  8. 问题 D: DD_BOND看到的hcy
  9. 校园二手物品交易网站毕业设计
  10. 为什么科技巨头们纷纷更换 Logo?