2016 UESTC Training for Dynamic Programming F - 柱爷与三叉戟不得不说的故事 压位dp
F - 柱爷与三叉戟不得不说的故事
Time Limit: 500/500MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
在喵蛤蛤城,人人都知晓柱爷有一把传奇武器三叉戟
.据传,这是一位在$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!
2016 UESTC Training for Dynamic Programming F - 柱爷与三叉戟不得不说的故事 压位dp相关推荐
- UESTC-2016dp专题 F 柱爷与三叉戟不得不说的故事
柱爷与三叉戟不得不说的故事 Time Limit: 500/500MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 题目链接 ...
- CDOJ 1355 柱爷与三叉戟不得不说的故事(枚举子集状压dp)
柱爷与三叉戟不得不说的故事 Time Limit: 500/500MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Subm ...
- 2016 UESTC Training for Data Structures F - 郭大侠与“有何贵干?” CDOJ 1335 线段树 扫描线 离散化
F - 郭大侠与"有何贵干?" 就是给一个三维空间,和N个长方体,问覆盖K次的体积 x和y都是1e9,但是z是[1,3],所以可以把这个分为两个二维平面,求被覆盖K次的面积,最后加 ...
- 2016 UESTC Training for Search Algorithm String I - 谭爷剪花布条 KMP
I - 谭爷剪花布条 Time Limit: 3000/100MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- 2016 UESTC Training for Data Structures J - 郭大侠与Rabi-Ribi 优先队列
J - 郭大侠与Rabi-Ribi Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others ...
- 2016 UESTC Training for Data Structures O - 卿学姐种美丽的花 树状数组+等差数列
O - 卿学姐种美丽的花 Time Limit: 8000/4000MS (Java/Others) Memory Limit: 125535/65535KB (Java/Others) Su ...
- UESTC_摩天轮 2015 UESTC Training for Dynamic ProgrammingProblem K
K - 摩天轮 Time Limit: 10000/4000MS (Java/Others) Memory Limit: 262143/262143KB (Java/Others) Submi ...
- UESTC_酱神寻宝 2015 UESTC Training for Dynamic ProgrammingProblem O
O - 酱神寻宝 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- 2016 UESTC Training for Data Structures J - 郭大侠与Rabi-Ribi CDOJ 1334 优先队列
J - 郭大侠与Rabi-Ribi 就是有N只兔子,每只兔子会存在a[i]秒,价值为v[i],然后每秒只能取一只兔子,问能取的兔子总价值的最大值是多少 用一个堆/优先队列维护就好了 首先我们先把兔子按 ...
最新文章
- NVelocity模板引擎的注意事项
- grunt.config()_gruntjs api
- 渭南java_渭南java语言入门教程视频
- android @id和@+id的区别
- ​TCP 拥塞控制详解
- 开始使用gradle(二)
- 文献阅读 | Epigenetics in ENS development and Hirschsprung disease
- 那些有实力进入 BAT 的本科生,都做对了什么事?
- 电视直播源码2.0-全站HTML文件
- PSFTP上传文件到服务器
- RAID 磁盘阵列详解,RAID分类及优缺点
- 第三次作业--结对编程
- 如何解决——打印出的纸张黑底白字?
- 【6.28校内test】T2 【音乐会】二重变革
- 微信会员php源码,基于ThinkPHP框架开发的在线微信拼车系统完整PHP源码-深蓝源码会员专享...
- 带电插拔损坏设备原理_那些设备可以热插拔?
- 使用Trove的integration定制化trove镜像
- 图像评价常用指标(PSNR、SSIM、LPIPS 、FID、Recall)
- 电影院和计算机的英语怎么说,电影院英文,在电影院用英语in还是at!
- excel如何进行两张表的自动关联?---vlookup