简单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使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Egret的容器--删除对象,遮罩
- 下一篇: R语言里面的循环变量