这题的难点在于状态的设计

  首先显然是个状压,需要一维表示卡的状态,另一维如果设计成天数,难以知道当前的钱数,没法确定是否能够购买新的卡,如果设计成钱数,会发现状态数过多,空间与时间都无法承受。但是可以发现,如果没有买卡的钱会因当前卡数变化而变化这个条件的话,买卡的钱是一定的,而我们因拥有卡而省的钱不会超过120(1+2+3+...+15)。所以可以将状态设计成f[i][j]表示卡的状态为i,省了j个红币,能省多少个蓝币。

  然后就结束了...

  注意所有下标为状态的数组的大小T T...

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
using namespace std;
const int maxn=20, inf=1e9;
int n, st, sumr, sumb, ans;
int r[maxn], b[maxn], cntr[1<<16], cntb[1<<16], f[1<<16][121];
char ch[maxn][2];
inline void read(int &k)
{int f=1; k=0; char c=getchar();while(c<'0' || c>'9') c=='-'&&(f=-1), c=getchar();while(c<='9' && c>='0') k=k*10+c-'0', c=getchar();k*=f;
}
int main()
{read(n); st=(1<<n)-1;for(int i=1;i<=n;i++)scanf("%s", ch[i]), read(r[i]), read(b[i]), sumr+=r[i], sumb+=b[i];for(int i=0;i<=st;i++)for(int j=1;j<=n;j++)if(i&(1<<(j-1)))cntr[i]+=(ch[j][0]=='R')?1:0, cntb[i]+=(ch[j][0]=='B')?1:0;memset(f,-1,sizeof(f)); f[0][0]=0;for(int i=0;i<=st;i++)for(int j=0;j<=120;j++)if(f[i][j]!=-1)for(int k=1;k<=n;k++)if(!(i&(1<<(k-1)))){int numr=min(r[k], cntr[i]), numb=min(b[k], cntb[i]);f[i|(1<<(k-1))][j+numr]=max(f[i|(1<<(k-1))][j+numr], f[i][j]+numb);}ans=inf;for(int i=0;i<=120;i++)if(f[st][i]!=-1)ans=min(ans, max(sumr-i, sumb-f[st][i]));printf("%d\n", ans+n);
}

View Code

转载于:https://www.cnblogs.com/Sakits/p/7745871.html

Codeforces 744C. Hongcow Buys a Deck of Cards(状压DP)相关推荐

  1. Codeforces Beta Round #8 C. Looking for Order 状压dp

    题目链接: http://codeforces.com/problemset/problem/8/C C. Looking for Order time limit per test:4 second ...

  2. Codeforces Round #585 (Div. 2)E. Marbles(状压dp)

    https://codeforces.com/contest/1215/problem/E cnt[x][j]表示把x这种颜色全放到j这种颜色前面所需要的交换次数. 其实这题跟上一篇博客那题是同一个套 ...

  3. 【Codeforces】Gym 101173B Bipartite Blanket 霍尔定理+状压DP

    题意 给一张$n\times m$二分图,带点权,问有多少完美匹配子集满足权值和大于等于$t$ 这里有一个结论:对于二分图$\mathbb{A}$和$\mathbb{B}$集合,如果子集$A \in ...

  4. Codeforces Gym 100676G Training Camp 状压dp

    http://codeforces.com/gym/100676 题目大意是告诉你要修n门课,每门课有一个权值w[i], 在第k天修该课程讲获得k*w[i]的学习点数,给出了课程与先修课程的关系,要修 ...

  5. Educational Codeforces Round 13 E. Another Sith Tournament 状压dp

    E. Another Sith Tournament 题目连接: http://www.codeforces.com/contest/678/problem/E Description The rul ...

  6. CodeForces - 1550E Stringforces(二分+状压dp)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串,只包含前 kkk 个小写字母以及通配符 ???,现在可以将通配符替换成任意的前 kkk 个字母中的一个.设 f[i]f[i]f[i] 为 ...

  7. Codeforces 1336E Chiori and Doll Picking (子集和变换、线性基、阈值算法、状压 DP、组合计数)...

    题目链接 https://codeforces.com/contest/1336/problem/E 题解 假设线性基大小是 \(L\),其异或值域记作 \(S\),则对于异或值域内每个数,显然有 \ ...

  8. CodeForces - 1523D Love-Hate(随机数+状压dp)

    题目链接:点击查看 题目大意:给出 nnn 个 010101 序列表示二进制状态,问选择至少 ⌈n2⌉\lceil \frac{n}{2}\rceil⌈2n​⌉ 个状态进行位运算的与运算后得到的答案中 ...

  9. Codeforces Round #585 (Div. 2) E. Marbles 状压dp + 逆序对

    传送门 文章目录 题意: 思路: 题意: 思路: 考虑数列最终的状态一定是相同颜色在一起,所以我们发现他的颜色是有顺序的!显然可以用状压dpdpdp来枚举颜色的顺序,但是又有问题了,你怎么确定当前这个 ...

最新文章

  1. 即日起更新机器学习相关博客
  2. JDK文档中关于Semaphore的正确使用以及使用场景
  3. linux终端安装cuda,Ubuntu下安装CUDA10.0以及问题
  4. Java-n个人报数
  5. 关闭子窗口 父窗口自动刷新
  6. 为什么C++永不过时?
  7. 多线程笔记补充之线程通信wait和notify方法以及Lock和Condition接口的使用
  8. 6.6.2赫夫曼编码
  9. IE浏览器整页截屏程序
  10. SSH连接原理及ssh-key
  11. 关于macOS自定义终端命令的方法
  12. [Material Design] 教你做一个Material风格、动画的按钮(MaterialButton)
  13. Outlier Detection with Isolation Forest(孤立森林异常检测)
  14. C语言图书管理系统 文件数据库
  15. vue实现留言板的功能_vue初探-简易留言板
  16. 图片试卷怎么打印出来?
  17. HTML设置网页小图标
  18. cookie 、localStorage 和 sessionStorage 区别
  19. MyBatisPuls入门案例
  20. python正版软件多少钱_正版数据库软件需要多少钱

热门文章

  1. LintCode初级题——fizz buzz
  2. 对JDBC操作数据库的简单封装
  3. 获取GridView中RowCommand的当前索引行
  4. Android 自定义下拉刷新
  5. Mr.J-- jQuery学习笔记(二十二)--入口函数
  6. java8新特性(2)--接口的默认方法
  7. Jmeter操作之跨线程组传递参数
  8. C#OOP之一面向对象简介
  9. 学习是第一生产力——学习型组织众书读后感
  10. 解决启动Distributed Transaction Coordinator服务出错的问题