BZOJ 3446: [Usaco2014 Feb]Cow Decathlon( 状压dp )

时间:2022-09-18 11:13:10

BZOJ 3446: [Usaco2014 Feb]Cow Decathlon( 状压dp )

水状压dp.

dp(x, s) = max{ dp( x - 1, s - {h} ) } + 奖励(假如拿到的) (h∈s). 时间复杂度O(n * 2^n)

----------------------------------------------------------------------------------

#include<bits/stdc++.h>
 
#define rep(i, n) for(int i = 0; i < n; ++i)
#define clr(x, c) memset(x, c, sizeof(x))
#define foreach(e, x) for(__typeof(x.begin()) e = x.begin(); e != x.end(); e++)
#define b(i) (1 << (i))
 
using namespace std;
 
const int maxn = 22;
 
int dp[2][b(maxn)], s[maxn][maxn], n;
vector<int> ok[maxn];
vector< pair<int, int> > rew[maxn];
 
int main() {
freopen("test.in", "r", stdin);
clr(dp, 0);
int b;
cin >> n >> b;
rep(i, n) {
ok[i].clear();
rew[i].clear();
}
while(b--) {
int p, k, a;
scanf("%d%d%d", &p, &k, &a); p--;
rew[p].push_back(make_pair(k, a));
}
int cur = 0, p = 1;
rep(i, n) rep(j, n) scanf("%d", s[i] + j);
rep(j, n) {
dp[cur][b(j)] = s[j][0];
foreach(it, rew[0]) if(s[j][0] >= it->first)
   dp[cur][b(j)] += it->second;
}
rep(t, b(n)) {
int cnt = 0;
rep(i, n) if(t & b(i)) cnt++;
if(cnt--) ok[cnt].push_back(t);
}
for(int i = 1; i < n; ++i) {
swap(cur, p);
foreach(it, ok[i]) {
rep(j, n) if(b(j) & *it) 
   dp[cur][*it] = max(dp[cur][*it], dp[p][*it ^ b(j)] + s[j][i]);
foreach(t, rew[i]) if(dp[cur][*it] >= t->first)
   dp[cur][*it] += t->second;
}
}
cout << dp[cur][b(n) - 1] << "\n";
return 0;
}

----------------------------------------------------------------------------------

3446: [Usaco2014 Feb]Cow Decathlon

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 58  Solved: 41
[Submit][Status][Discuss]

Description

FJ有N(1 <= N <= 20)头奶牛,编号1至N。FJ提供N种不同的技能供奶牛们学习,每头奶牛只能学习一门技能,每门技能都要有奶牛学习。 第i头奶牛学习第j门技能,FJ得到的分数S[i][j],1<=S[i][j]<=1000。此外还有B(1 <= B <= 20)个奖励,第i个奖励的格式是: Pi 、Ki 、Ai,表示的意义是:如果学习完前Ki门技能后的总得分(包括额外的奖励得分)不少于Pi,那么FJ还会得到额外的Ai分。那么FJ应该如何安排奶牛学习技能,才能使得最后的总得分最高?

Input

第一行,N和B。  接下来有B行,每行三个整数:Pi 、Ki 、Ai。1 <= Pi <= 40000,1 <= Ai <= 1000。    接下来有N行N列的二维数组,表示S[i][j]。1 <= S[i][j] <= 1000。

Output

一个整数,最大得分。

Sample Input

3 1
2 7 6
5 1 7
2 2 4
4 2 1

Sample Output

17
奶牛1学习技能1,奶牛2学习技能3,奶牛3学习技能2。

HINT

Source

BZOJ 3446: [Usaco2014 Feb]Cow Decathlon( 状压dp )的更多相关文章

  1. bzoj3446&lbrack;Usaco2014 Feb&rsqb;Cow Decathlon&ast;

    bzoj3446[Usaco2014 Feb]Cow Decathlon 题意: FJ有n头奶牛.FJ提供n种不同的技能供奶牛们学习,每头奶牛只能学习一门技能,每门技能都要有奶牛学习. 第i头奶牛学习 ...

  2. &lbrack;BZOJ 1072&rsqb; &lbrack;SCOI2007&rsqb; 排列perm 【状压DP】

    题目链接:BZOJ 1072 这道题使用 C++ STL 的 next_permutation() 函数直接暴力就可以AC .(使用 Set 判断是否重复) 代码如下: #include <io ...

  3. BZOJ 3195 &lbrack;Jxoi2012&rsqb;奇怪的道路 &vert; 状压DP

    传送门 BZOJ 3195 题解 这是一道画风正常的状压DP题. 可以想到,\(dp[i][j][k]\)表示到第\(i\)个点.已经连了\(j\)条边,当前\([i - K, i]\)区间内的点的度 ...

  4. BZOJ 1087&colon; &lbrack;SCOI2005&rsqb;互不侵犯King &lbrack;状压DP&rsqb;

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  5. BZOJ 2734 &lbrack;HNOI2012&rsqb;集合选数 &lpar;状压DP、时间复杂度分析&rpar;

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2734 题解 嗯早就想写的题,昨天因为某些不可告人的原因(大雾)把这题写了,今天再来写题解 ...

  6. BZOJ&period;4160&period;&lbrack;NEERC2009&rsqb;Exclusive Access 2&lpar;状压DP Dilworth定理&rpar;

    BZOJ DAG中,根据\(Dilworth\)定理,有 \(最长反链=最小链覆盖\),也有 \(最长链=最小反链划分数-1\)(这个是指最短的最长链?并不是很确定=-=),即把所有点划分成最少的集合 ...

  7. BZOJ 4197 NOI 2015 寿司晚宴 状压DP

    4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 694  Solved: 440[Submit][Status] ...

  8. BZOJ 1879 &lbrack;Sdoi2009&rsqb;Bill的挑战 ——状压DP

    本来打算好好写写SDOI的DP题目,但是忒难了, 太难了,就写的这三道题仿佛是可做的. 生在弱省真是兴奋. 这题目直接状压,f[i][j]表示匹配到i,状态集合为j的方案数,然后递推即可. #incl ...

  9. bzoj 4197&colon; &lbrack;Noi2015&rsqb;寿司晚宴【状压dp】

    一个数内可能多个的质因数只有小于根号n的,500内这样的数只有8个,所以考虑状压 把2~n的数处理出小于根号500的质因数集压成s,以及大质数p(没有就是1),然后按p排序 根据题目要求,拥有一个质因 ...

随机推荐

  1. Lambda表达式关于like问题&lpar;未解决&rpar;

    参考文章: http://*.com/questions/3616215/like-in-lambda-expression-and-linq 1. c=>c.name. ...

  2. MySQL数据库最大连接数

    MYSQL数据库安装完毕后,默认最大连接数是100. 命令: show processlist; 假设是root帐号,你能看到全部用户的当前连接.假设是其他普通帐号,仅仅能看到自己占用的连接. sho ...

  3. 网络流入门—用于最大流的Dinic算法

    "网络流博大精深"-sideman语 一个基本的网络流问题 最早知道网络流的内容便是最大流问题,最大流问题很好理解: 解释一定要通俗! 如右图所示,有一个管道系统,节点{1,2,3 ...

  4. spring之事务

    1.编程式事务 2.声明式事务:aop

  5. JS&sol;Jquery版本的俄罗斯方块&lpar;附源码分析&rpar;

    转载于http://blog.csdn.net/unionline/article/details/63250597 且后续更新于此 1.前言 写这个jQuery版本的小游戏的缘由在于我想通过从零到有 ...

  6. java23种设计模式之一&colon; 策略模式

    由于最近在研究学习设计模式,我会用自己的理解方式来表述对设计模式的学习和认识,通过最常用.好记的案例来记住和使用设计模式,希望对设计代码方面有所提高和改进. 一.应用背景     在软件开发中常常遇到 ...

  7. springMVC注解的参数传递

    1.web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=&qu ...

  8. Linux文件IO操作函数概述

    文件概述 Linux中,一切皆文件.文件为操作系统服务和设备提供了一个简单而一致的接口.这意味着程序完全可以像使用文件那样使用磁盘文件.串行口.打印机和其他设备. 也就是说,大多数情况下,你只需要使用 ...

  9. 解读大内老A的《&period;NET Core框架本质》

    老A说的一句话让我很受启发,想要深入了解框架,你要把精力聚焦在架构设计的层面来思考问题.而透彻了解底层原理,最好的笨办法就是根据原理对框架核心进行重建或者说再造.看起来没有捷径,也是最快的捷径. 题外 ...

  10. linux epoll的实现原理

    1 linux的poll操作 linux文件的poll操作有两个主要目的:第一,主动查看该文件上是否有读写事件:第二,提供操作waitqueue的接口给epoll等上层接口使用,比如epoll可以通过 ...