F - 柱爷与三叉戟不得不说的故事

Time Limit: 500/500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)

Submit  Status

在喵蛤蛤城,人人都知晓柱爷有一把传奇武器三叉戟.据传,这是一位在$772002$年前陨落的强大守护者F91曾经使用过的12级灵能武器,

拥有毁天灭地的力量

但只有很少人知道当柱爷获得三叉戟时,三叉戟的力量已经消失殆尽.为了能修复三叉戟的力量,柱爷苦心专研

古籍,发现只有找到最神秘的15种元素,将元素的力量重新注入到三叉戟中,三叉戟就能恢复到原来的力量,

于是柱爷踏上了寻找神秘元素的旅行.

柱爷首先发现15个由卿学姐掌控的地牢,里面正好有15种对应元素.冷静的柱爷没有贸然行动,经过一番详细的打听,

柱爷得知了第i种元素需要Di的精力去获得;与此同时,柱爷还发现了由白学潘看守的N个洞穴,第i个洞穴中

有Ai个不同的元素,分别是B1,B2,...,B Ai,需要Ci的精力去获得.

同种元素不得拥有多个,不然元素之间会产生强大的斥力,会发生爆炸;不能攻下一个洞穴后,留有元素不拿走,

元素可能会辐射,伤害喵哈哈村的大爷......

但是柱爷岂是凡人?柱爷修复三叉戟时花费的总是最小的精力!

那么这个最小的花费是多少呢?

Input

第一行包括15个正整数,第i个数表示Di.

第二行包括一个整数表示N.

接下来N行,每行有一个整数表示Ai,后面紧接着Ai个不同的正整数,最后又一个正整数Ci表示需要花费的精力.

数据保证:

  • 0 <= N <= 10000

  • 1 <= Di <= 20000

  • 0 <= Ai <= 5

  • 1 <= Ci <= 2000000

Output

输出一个整数ans:

表示至少花ans的精力去修复三叉戟.

Sample input and output

Sample Input Sample Output
9599 11186 3513 3112 19106 1171 4254 4786 11880 19550 4793 17049 10779 11096 9713
5
4 10 1 8 11 1212645
3 14 9 15 1655560
3 7 3 14 1161262
5 13 5 9 2 11 710512
0 980331
141587

Source

2016 UESTC Training for Dynamic Programming

My Solution

压位dp

dp[i] 表示状态为i是的最小消费, 状态i则是i的二进制表示以后哪些地方是1表示有已经获得了哪些元素

Ind = 1<<0, 表示有元素 1;

Ind = 1<<15 表示有元素 15;

Ind = 0;

Ind += 1<<0;]

Ind += 1<<15;

然后Ind 表示有元素 1 、15;

然后有十五个元素, 所以最多1<<15, 设为 maxi = (1<<15) + 2;

然后

for(int i = 0; i < maxi; i++){
        for(int j = i; j; j = (j - 1) & i){         //!这样就可以枚举了可能的子集了
            dp[i] = min(dp[i], dp[j] + dp[j^i]);
        }
 }

就好了,dp[maxn]先初始化为 Inf = 1e9数量级的, memset(dp, 0x3f, sizeof dp);

然后输入的时候根据元素集合计算Ind , 保留min{dp[Ind};

然后从0 ~ maxi 所以状态,包括无效状态(就是并没有值输入, 为Inf的那些状态)一起转移;

最好Ind = 0, i = 0 ~ 15

Ind += 1<<i;

然后输出dp[Ind].

复杂度 O(1e7);

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 50000, maxi = (1<<15) + 2;int dp[maxn];int main()
{#ifdef LOCALfreopen("a.txt", "r", stdin);#endif // LOCALint n, d, a, ai, c, Ind;memset(dp, 0x3f, sizeof dp);//cout<<(dp[0])<<endl;   1e9级的//int l = 1e9;//cout<<l<<endl;for(int i = 0; i < 15; i++){scanf("%d", &d);Ind = 1<<i;//cout<<Ind<<endl;dp[Ind] = d;}scanf("%d", &n);while(n--){Ind = 0;scanf("%d", &a);for(int i = 0; i < a; i++){scanf("%d", &ai);Ind += (1<<(ai-1));  //!WA5    用 1<<0 表示有 元素 1 的}scanf("%d", &c);if(Ind != 0) dp[Ind] = min(dp[Ind], c);     //WA5  不是test5 触发的Bug  但如果 a == 0, 就是什么也没有 好吧, 没什么影响有效的是1开始的}for(int i = 0; i < maxi; i++){for(int j = i; j; j = (j - 1) & i){         //!这样就可以枚举了可能的子集了dp[i] = min(dp[i], dp[j] + dp[j^i]);}}Ind = 0;for(int i = 0; i < 15; i++)Ind += (1<<i);printf("%d", dp[Ind]);return 0;
}

Thank you!

                                                                                                                                               ------from ProLights

2016 UESTC Training for Dynamic Programming F - 柱爷与三叉戟不得不说的故事 压位dp相关推荐

  1. UESTC-2016dp专题 F 柱爷与三叉戟不得不说的故事

    柱爷与三叉戟不得不说的故事 Time Limit: 500/500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) 题目链接 ...

  2. CDOJ 1355 柱爷与三叉戟不得不说的故事(枚举子集状压dp)

    柱爷与三叉戟不得不说的故事 Time Limit: 500/500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Subm ...

  3. 2016 UESTC Training for Data Structures F - 郭大侠与“有何贵干?” CDOJ 1335 线段树 扫描线 离散化

    F - 郭大侠与"有何贵干?" 就是给一个三维空间,和N个长方体,问覆盖K次的体积 x和y都是1e9,但是z是[1,3],所以可以把这个分为两个二维平面,求被覆盖K次的面积,最后加 ...

  4. 2016 UESTC Training for Search Algorithm String I - 谭爷剪花布条 KMP

    I - 谭爷剪花布条 Time Limit: 3000/100MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit ...

  5. 2016 UESTC Training for Data Structures J - 郭大侠与Rabi-Ribi 优先队列

    J - 郭大侠与Rabi-Ribi Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others ...

  6. 2016 UESTC Training for Data Structures O - 卿学姐种美丽的花 树状数组+等差数列

    O - 卿学姐种美丽的花 Time Limit: 8000/4000MS (Java/Others)     Memory Limit: 125535/65535KB (Java/Others) Su ...

  7. UESTC_摩天轮 2015 UESTC Training for Dynamic ProgrammingProblem K

    K - 摩天轮 Time Limit: 10000/4000MS (Java/Others)     Memory Limit: 262143/262143KB (Java/Others) Submi ...

  8. UESTC_酱神寻宝 2015 UESTC Training for Dynamic ProgrammingProblem O

    O - 酱神寻宝 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  ...

  9. 2016 UESTC Training for Data Structures J - 郭大侠与Rabi-Ribi CDOJ 1334 优先队列

    J - 郭大侠与Rabi-Ribi 就是有N只兔子,每只兔子会存在a[i]秒,价值为v[i],然后每秒只能取一只兔子,问能取的兔子总价值的最大值是多少 用一个堆/优先队列维护就好了 首先我们先把兔子按 ...

最新文章

  1. NVelocity模板引擎的注意事项
  2. grunt.config()_gruntjs api
  3. 渭南java_渭南java语言入门教程视频
  4. android @id和@+id的区别
  5. ​TCP 拥塞控制详解
  6. 开始使用gradle(二)
  7. 文献阅读 | Epigenetics in ENS development and Hirschsprung disease
  8. 那些有实力进入 BAT 的本科生,都做对了什么事?
  9. 电视直播源码2.0-全站HTML文件
  10. PSFTP上传文件到服务器
  11. RAID 磁盘阵列详解,RAID分类及优缺点
  12. 第三次作业--结对编程
  13. 如何解决——打印出的纸张黑底白字?
  14. 【6.28校内test】T2 【音乐会】二重变革
  15. 微信会员php源码,基于ThinkPHP框架开发的在线微信拼车系统完整PHP源码-深蓝源码会员专享...
  16. 带电插拔损坏设备原理_那些设备可以热插拔?
  17. 使用Trove的integration定制化trove镜像
  18. 图像评价常用指标(PSNR、SSIM、LPIPS 、FID、Recall)
  19. 电影院和计算机的英语怎么说,电影院英文,在电影院用英语in还是at!
  20. excel如何进行两张表的自动关联?---vlookup

热门文章

  1. 关于写计算机作文,描写电脑的作文
  2. 计算机桌面最下边的横条叫做,在屏幕下方那个蓝色的横条并且带有开始的那个地方叫什么?...
  3. java实现的坦克大战
  4. IR780 NH2可用作光热疗法治疗剂,IR780-氨基
  5. 改变Button的样式
  6. 郭明錤:苹果最早从今年第四季度开始大规模生产AR设备
  7. 国内免费网络硬盘个人汇总
  8. python 基础练习 打印歌词
  9. 计算机考证 2021年下半年软考成绩查询时间终于公布了 速查
  10. 移动,联通,电信与2g,3g