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

Gold

时间: 2024-08-24 13:45:05

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

bzoj3446[Usaco2014 Feb]Cow Decathlon*

bzoj3446[Usaco2014 Feb]Cow Decathlon 题意: FJ有n头奶牛.FJ提供n种不同的技能供奶牛们学习,每头奶牛只能学习一门技能,每门技能都要有奶牛学习. 第i头奶牛学习第j门技能,FJ得到的分数S[i][j].此外还有b个奖励,第i个奖励的格式是: Pi .Ki .Ai,表示的意义是:如果学习完前Ki门技能后的总得分(包括额外的奖励得分)不少于Pi,那么FJ还会得到额外的Ai分.求通过安排奶牛学习技能,所能取得的最高总得分.n,b≤20. 题解: 状压dp.f[i

[BZOJ 1072] [SCOI2007] 排列perm 【状压DP】

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

BZOJ 1087: [SCOI2005]互不侵犯King( 状压dp )

简单的状压dp... dp( x , h , s ) 表示当前第 x 行 , 用了 h 个 king , 当前行的状态为 s . 考虑转移 : dp( x , h , s ) = ∑ dp( x - 1 , h - cnt_1( s ) , s' ) ( s and s' 两行不冲突 , cnt_1( s ) 表示 s 状态用了多少个 king ) 我有各种预处理所以 code 的方程和这有点不一样 ------------------------------------------------

BZOJ 1879 [Sdoi2009]Bill的挑战 ——状压DP

本来打算好好写写SDOI的DP题目,但是忒难了, 太难了,就写的这三道题仿佛是可做的. 生在弱省真是兴奋. 这题目直接状压,f[i][j]表示匹配到i,状态集合为j的方案数,然后递推即可. #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define F(i,j,k) for (int i=j;i<=k

BZOJ 1076 SCOI2008 奖励关 期望状压DP

题目大意:给定k次弹出宝物的机会,每次随机弹出n种宝物的机会,如果吃过这种宝物的所有前提宝物就可以吃这种宝物,求最优策略的期望得分 看到数据范围果断状压DP- - 不看数据范围害死人- - 至于吃还是不吃 这是个问题 对于这种最优策略的期望DP 我们一般都是从后往前推 枚举每次出现宝物 枚举此时的状态 枚举宝物是哪种 如果当前的宝物可以吃 就在吃与不吃的后继状态中选择最大值加到当前状态上 如果当前的宝物不能吃 只能选择不吃的后继状态加到当前状态上 最后输出f[1][0]就是答案 #include

BZOJ 4197 NOI 2015 寿司晚宴 状压DP

4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 694  Solved: 440[Submit][Status][Discuss] Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n?1 种不同的寿司,编号 1,2,3,-,n?1,其中第 i 种寿司的美味度为 i+1 (即

bzoj 4197: [Noi2015]寿司晚宴【状压dp】

一个数内可能多个的质因数只有小于根号n的,500内这样的数只有8个,所以考虑状压 把2~n的数处理出小于根号500的质因数集压成s,以及大质数p(没有就是1),然后按p排序 根据题目要求,拥有一个质因数的只能给一个人,所以排序后能给一个人的大质数就是一个区间 然后设f[s1][s2]为一人选s1,另一人选s2的方案数,注意这里的s只压了小于根号500的八个质数 设g[0/1][s1][s2]为一人选s1,另一人选s2的,当前枚举的大质数给小G/小W的方案数 正常转移即可 然后注意把g转到f上时应

BZOJ 1559: [JSOI2009]密码( AC自动机 + 状压dp )

建AC自动机后, dp(x, y, s)表示当前长度为x, 在结点y, 包括的串的状态为s的方案数, 转移就在自动机上走就行了. 对于输出方案, 必定是由给出的串组成(因为<=42), 所以直接暴搜答案. 数据范围很小, 可以AC(复杂度懒得算了....) ------------------------------------------------------------------------------------------------ #include<cstdio> #in

bzoj 2734: [HNOI2012]集合选数 状压DP

2734: [HNOI2012]集合选数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 560  Solved: 321[Submit][Status] Description <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中.同学们不喜欢这种具有枚举性 质的题目,于是把它变成了以下问题:对于任意一个正整数 n≤100000,如何