简单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[]; int dp[<<]; 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 |= <<(ID[book]-);
}
b++;
} int S = <<tot;
dp[] = ;
for(int i=;i<S;i++) dp[i] = INF;
for(int i=;i<S;i++) {
for(int j=;j<b;j++) {
dp[i|books[j].id] = min(dp[i|books[j].id], dp[i]+books[j].cost);
}
}
cout<<dp[S-]<<endl;
return ;
}
最后关于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):返回迭代器,判断是否存在。
简单DP (Preparing for Xtreme 12.0) | STL map使用的更多相关文章
- URAL 1203 Scientific Conference 简单dp 难度:0
http://acm.timus.ru/problem.aspx?space=1&num=1203 按照结束时间为主,开始时间为辅排序,那么对于任意结束时间t,在此之前结束的任务都已经被处理, ...
- Codeforces 41D Pawn 简单dp
题目链接:点击打开链接 给定n*m 的矩阵 常数k 以下一个n*m的矩阵,每一个位置由 0-9的一个整数表示 问: 从最后一行開始向上走到第一行使得路径上的和 % (k+1) == 0 每一个格子仅仅 ...
- poj1189 简单dp
http://poj.org/problem?id=1189 Description 有一个三角形木板,竖直立放.上面钉着n(n+1)/2颗钉子,还有(n+1)个格子(当n=5时如图1).每颗钉子和周 ...
- 『简单dp测试题解』
这一次组织了一场\(dp\)的专项考试,出了好几道经典的简单\(dp\)套路题,特开一篇博客写一下题解. Tower(双向dp) Description 信大家都写过数字三角形问题,题目很简单求最大化 ...
- 简单 dp
1.摆花问题 题目描述小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过a ...
- HDU 5375 Gray code (简单dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5375 题面: Gray code Time Limit: 2000/1000 MS (Java/Oth ...
- 洛谷P1130红牌(简单DP)
题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌.获得红牌的过程是相当复杂 ,一共包括NNN个步骤.每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件.为了加快进程,每一步政府都 ...
- 4.15 每周作业 —— 简单DP
免费馅饼 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submissi ...
- hdu2067 简单dp或者记忆化搜索
题意: 小兔的棋盘 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
随机推荐
- C#下面的次幂表达
嗯,一个错误.不能用x^y表达,要用math.pow(x,y).
- final修饰和StringBuffer的几个案例(拼接,反转,对称操作)
final关键字修饰时如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改:如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象,但引用变量不能变,引用变量所指向的对象中的内容还 ...
- JS对象 返回星期方法 getDay() 返回星期,返回的是0-6的数字,0 表示星期天。如果要返回相对应“星期”,通过数组完成
返回星期方法 getDay() 返回星期,返回的是0-6的数字,0 表示星期天.如果要返回相对应"星期",通过数组完成,代码如下: <script type="te ...
- 概率+后效性处理——cf930B好题
之前题目看错了.. 先用双倍字符串处理后效性 首先要确定一个结论:如果原串s中相距为d的ch1和ch2只有一对,那么如果第一个翻开ch1,第二个翻开ch2,就能确定k 现在要求的是当我们第一次翻开的是 ...
- 异或+桶——cf768C
有个结论是到最后肯定出现循环节..感觉这种做法有点歪 正解当然是题解啦 虽然到了1e8,但是cf上还是能过的 #include<bits/stdc++.h> #define rep(i,s ...
- Android NDK应用原理
转:http://shihongzhi.com/ndk/ 那么首先看一下Android的系统框架: 最底层是Linux Kernel,然后上面是封装的库及Android runtime.再上面是App ...
- swiper在loop模式,当轮播到最后一张图时候,做其他事件
1.引入文件: <link rel="stylesheet" href="css/swiper.min.css"> <script src=& ...
- JS 变量的数据类型转换
变量的类型转换,一般情况是JS自动转换的,但也有些时候需要手动转换. 1.其它类型转成布尔型 函数和方法的区别 Boolean(a) //函数是可以独立使用的 document.write(a) ...
- shell常用命令及正则辅助日志分析统计
https://www.cnblogs.com/wj033/p/3451618.html 正则日志分析统计 3 grep 'onerror' v3-0621.log | egrep -v '(\d ...
- 在windows中用cmd命令执行python无限循环程序如何停止
在windows中用cmd命令测试python带有无限循环的程序,当想要终止时, 即linux中的Ctrl + D 相似的功能时可以用 Ctrl + Pause Break, 有FN功能键的可能要使用 ...