简单DP (Preparing for Xtreme 12.0) | STL map使用
当水题遇上了map大坑
晚上写一个dp,弄了半天样例一直不过,对着队友的代码一行行看,发现跟自己逻辑完全一样啊。。。
然后就逐行输出比对,发现预处理出了问题,把map插入新值的地方改了下,果然就好了。。。
折腾半晚上,不吐不快。
以前使用STL的map时,一直把它当作一种高级数组,很少使用insert来插入键值对,都是直接用下标索引直接插入新值。而在map中查找key时,我也一般直接采取判断mp[key]是否为0。
而这题这样用也没多大问题,就怪我太作了,把tot默认设置为-1,方便++tot后从0开始计数。。。
但是插入跟第一个相同的key时,由于ID[key]==0,就把ID[key]的值更新了。。。
调试半天都没发现这样的bug啊T_T T_T T_T
直接上AC代码:
#include<iostream> #include<vector> #include<cstring> #include<sstream> #include<algorithm> #include<map> using namespace std; const int INF = 0x3f3f3f3f; int b, tot; map<string, int> ID; struct book{int id;int cost; }books[110];int dp[1<<22];int main() {int cost;while(cin>>cost) {books[b].cost = cost;string line, book;getline(cin, line);stringstream ss(line);while(ss>>book) {// if(!ID.count(book)) ID.insert(make_pair(book, ++tot));// if(ID.find(book)==ID.end()) ID.insert(make_pair(book, ++tot));// map里没有键book,则插入if(!ID[book]) ID[book] = ++tot;books[b].id |= 1<<(ID[book]-1);}b++;}int S = 1<<tot;dp[0] = 0;for(int i=1;i<S;i++) dp[i] = INF;for(int i=0;i<S;i++) {for(int j=0;j<b;j++) {dp[i|books[j].id] = min(dp[i|books[j].id], dp[i]+books[j].cost);}}cout<<dp[S-1]<<endl;return 0; }
最后关于map的使用,还是推荐注释部分的写法。
这篇博客讲了这两种插入的效率问题,我想区别不是太大,直接用ID[book]=++tot也是可以的。
在以后的使用中还是要尽量避免直接使用下标访问,应该如果你要访问的key不存在的话,会默认插入新的值,size也会增加。
map的查找操作使用总结如下
在map中,由key查找value时,首先要判断map中是否包含key。
如果不检查,直接返回map[key],可能会出现意想不到的行为。如果map包含key,没有问题,如果map不包含key,使用下标有一个危险的副作用,会在map中插入一个key的元素,value会取默认值0。
map提供了两种方式,查看是否包含key,m.count(key),m.find(key)。
m.count(key):由于map不包含重复的key,因此m.count(key)取值为0,或者1,表示是否包含。
m.find(key):返回迭代器,判断是否存在。
转载于:https://www.cnblogs.com/izcat/p/10680808.html
简单DP (Preparing for Xtreme 12.0) | STL map使用相关推荐
- Pig安装及简单使用(pig0.12.0 hadoop2.2.0)
我们用MapReduce进行数据分析.当业务比较复杂的时候,使用MapReduce将会是一个很复杂的事情,比如你需要对数据进行很多预处理或转换,以便能够适应MapReduce的处理模式,另一方面,编写 ...
- Android简单适配9.0~12.0
适配6.0~8.0的可以看下这个: 适配Android6.0到8.0详细过程--小白教程 注意:10.0到12.0的都是些网上看到的资料,我就适配到10.0的文件存储,如有不对的,可以留言,我会查阅修 ...
- Flink1.12.0简单实现wordcount
文章目录 前言 一.Flink1.12.0简单实现wordcount 二.使用步骤 1.引入pom.xml 2.主类 3.运行结果 总结 前言 Flink1.12.0简单实现wordcount 一.F ...
- Codeforces 41D Pawn 简单dp
题目链接:点击打开链接 给定n*m 的矩阵 常数k 以下一个n*m的矩阵,每一个位置由 0-9的一个整数表示 问: 从最后一行開始向上走到第一行使得路径上的和 % (k+1) == 0 每一个格子仅仅 ...
- hdu2067 简单dp或者记忆化搜索
题意: 小兔的棋盘 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- P1005 矩阵取数游戏(__int128模板/简单dp)
转跳P1005 题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的 n \times mn×m 的矩阵,矩阵中的每个元素 a_{i,j}a i,j 均为非负整数.游戏规则如下: 每次取数时 ...
- 第3章 感受(一)——3.12. Hello STL 向量篇
[回到目录] 白话C++ 3.12. Hello STL 向量篇 " 好消息!第XXX届国际美女大赛即将在中国举行,届时将有2999名来自世界各地的美女参赛.最新消息表明,本次大赛将对所有数 ...
- 4.15 每周作业 —— 简单DP
免费馅饼 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submissi ...
- NUC-ACM/ICPC 寒假训练 简单DP A - G题
第一题:数塔 HDU - 2084 做法: 从第 i , j 个 节点往下走的最优解可以由从第 i+1,j 个节点往下走的最优解和第i+1,j+1个节点往下走的最优解得出,二者取其优即可. 代码: 记 ...
最新文章
- OpenStack RPM Sample 解析
- [恢]hdu 2077
- 2017百度之星程序设计大赛 - 初赛(A)数据分割
- android glide的历史,Android 图片加载的那些事:为什么你的Glide 缓存没有起作用?...
- html布局(盒子)
- 微软老兵 Antoine LeBlond 将正式离职
- 写了10年Javascript未必全了解的标识符顺序
- 电子计算机专业vs土木工程专业,最难学十大工科专业 不想累成狗就别去(高薪)...
- Nodejs教程09:实现一个带接口请求的简单服务器
- 关于maven项目中的Missing artifact *.jar ...
- Java:计算立方体的体积和底面积
- C语言实现矩阵卷积运算
- 计算机硬盘和分区是什么关系,电脑硬盘如何分区 电脑硬盘分区注意事项【详解】...
- emcy协议_商铺三方租赁协议合同范本
- eas bos编码重复
- 【云IDE】CSDN云IDE的初探以及实战操作
- 显卡和CPU的关系像“主仆”,GPU的工作原理是什么
- 自动化1121和1122班学生链接
- “新基建”背景下,智慧灯杆产业面临的问题及思考
- IT行业招聘技巧--渠道篇
热门文章
- Java:清空文件内容
- Git学习总结(一)
- webpack学习笔记--安装
- ubuntu 安装lamp
- Ubuntu设置RS-232串口登陆终端(译文,节选)
- Linux,OS X mark工具(目录跳转工具)
- 从零开始学C++之继承(一):公有/私有/保护继承、overload/overwrite/override之间的区别...
- (zz)Sql Server 2005中的架构(Schema)、用户(User)、角色(Role)和登录(Login)(三)
- 40 | 案例篇:网络请求延迟变大了,我该怎么办?
- 服务端命令(dockerd)