UVA 11691 - Allergy Test(状压dp+贪心)

题目链接:11691 - Allergy Test

题意:这题题意看了老半天都没弄懂,好在后面找到个PPT,上面有中文题意- -,不过上面的做法是纯贪心,挺巧妙的但是感觉有点不靠谱,

下载地址:http://par.cse.nsysu.edu.tw/~advprog/advprog2011/11691.ppt

給N種過敏原的存活期,每天可把一種過敏原注入人體內。若有兩個以上過敏原存活於人體中,則無法進行實驗(也就是每種過敏原都必須有一天是單獨存活於人體中)。實驗結束於最後的過敏原死亡的那天,求最短實驗天數。

思路:我的思路是状态压缩dp+贪心,20个过敏原做状态压缩,然后每次加过敏原的时候,尽量往里面覆盖,dp[s][k],s表示过敏原使用状态,k表示后面通出来单独存在过敏原的天数,然后选一个新的过敏原去尽量覆盖他,这样k的一维只要开到7就够了,因为每段长度最多就是7。状态转移方程为:

dp[k][s] = min{dfs(s^(1<<i), max(0, num[i] - k - 1)) + max(1, num[i] - k)}

代码:

#include <stdio.h>
#include <string.h>
#include <map>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
const int N = 25;
const int M = (1<<20) + 5;
int t, n, num[N], dp[M][8];

int dfs(int s, int k) {
    if (dp[s][k] != -1) return dp[s][k];
    dp[s][k] = INF;
    if (s == (1<<n) - 1) return dp[s][k] = 0;
	int vis[8];
	memset(vis, 0, sizeof(vis));
    for (int i = 0; i < n; i++) {
		if (vis[num[i]]) continue;
        if (s&(1<<i)) continue;
		vis[num[i]] = 1;
        int t = dfs(s^(1<<i), max(0, num[i] - k - 1)) + max(1, num[i] - k);
        dp[s][k] = min(dp[s][k], t);
    }
    return dp[s][k];
}

int main() {
    scanf("%d", &t);
    while (t--) {
        scanf("%d", &n);
		memset(dp, -1, sizeof(dp));
        for (int i = 0; i < n; i++)
            scanf("%d", &num[i]);
        printf("%d\n", dfs(0, 0));
    }
    return 0;
}

UVA 11691 - Allergy Test(状压dp+贪心),码迷,mamicode.com

时间: 2024-10-08 05:50:02

UVA 11691 - Allergy Test(状压dp+贪心)的相关文章

UVA 11825 Hackers&#39; Crackdown 状压DP

感觉白书上的做法很神! 首先状压表示电脑之间的联通关系,然后预处理出所有关闭电脑的组合达到的状态,然后枚举每个状态并且枚举每个状态的所有子集,之后无脑递推就木有了. 关于枚举一个状态所有子集的小技巧:假设当前状态是S0 有 for s = s0; s != 0; s =  (s - 1) & s0 #include <cstdio> #include <cstring> #include <iostream> #include <map> #incl

UVA 1252 Twenty Questions 状压DP

简单状压DP: 当前状态s如果这个物品有状态a个属性,枚举下一个要猜测的特征k dp[s][a]=min(dp[s][a],max(dp[s+k][a],dp[s+k][a+k])+1); 4643 - Twenty Questions Asia - Tokyo - 2009/2010 Consider a closed world and a set of features that are defined for all the objects in the world. Each feat

UVA 11825 Hackers’ Crackdown 状压DP枚举子集势

Hackers’ Crackdown Miracle Corporations has a number of system services running in a distributed computer system which is a prime target for hackers. The system is basically a set of N computer nodes with each of them running a set of Nservices. Note

UVA - 1252 Twenty Questions (状压dp+vis数组加速)

有n个物品,每个物品有m个特征.随机选择一个物品让你去猜,你每次可以询问一个特征的答案,问在采取最优策略时,最坏情况下需要猜的次数是多少. 设siz[S]为满足特征性质集合S的特征的物品总数,dp[S]为当前得到的物品特征信息为S的情况下最坏情况下需要猜多少次,则$dp[S]=max\{dp(S|(1<<(2*i))),dp(S|(2<<(2*i))\}$(为了表示某个特征不确定的状态,需要将集合大小加倍).dfs预处理siz的复杂度为$O(n*2^m)$,dp的复杂度为$O(m*

(状压dp)uva 10817 Headmaster&#39;s Headache

题目地址 1 #include <bits/stdc++.h> 2 typedef long long ll; 3 using namespace std; 4 const int MAX=1e5+5; 5 const int INF=1e9; 6 int s,m,n; 7 int cost[125]; 8 //char sta[MAX]; 9 string sta; 10 int able[125]; 11 int dp[125][1<<8][1<<8]; 12 in

UVA 10817 Headmaster&#39;s Headache 状压DP

记录两个状态S1,S2分别记录哪些课程被1个人教过或2个人教过,然后记忆化搜索 UVA - 10817 Headmaster's Headache Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Problem D: Headmaster's Headache Time limit: 2 seconds The headmaster of Spr

【UVa】Headmaster&#39;s Headache(状压dp)

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1758 晕....状压没考虑循环方向然后错了好久.. 这点要注意...(其实就是01背包变成了完全背包QAQ 我们将课程拆成两个点,然后状压 那么答案就是(1<<(s<<1))-1 转移就不说了,,,,,太简单.. #include <cstdio> #in

uva 11825 Hackers&amp;#39; Crackdown (状压dp,子集枚举)

题目链接:uva 11825 题意: 你是一个黑客,侵入了n台计算机(每台计算机有同样的n种服务),对每台计算机,你能够选择终止一项服务,则他与其相邻的这项服务都终止.你的目标是让很多其它的服务瘫痪(没有计算机有该项服务). 思路:(见大白70页,我的方程与大白不同) 把n个集合P1.P2.Pn分成尽量多的组,使得每组中全部集合的并集等于全集,这里的集合Pi是计算机i及其相邻计算机的集合,用cover[i]表示若干Pi的集合S中全部集合的并集,dp[s]表示子集s最多能够分成多少组,则 假设co

UVA - 10817 Headmaster&#39;s Headache (状压dp+记忆化搜索)

题意:有M个已聘教师,N个候选老师,S个科目,已知每个老师的雇佣费和可教科目,已聘老师必须雇佣,要求每个科目至少两个老师教的情况下,最少的雇佣费用. 分析: 1.为让雇佣费尽可能少,雇佣的老师应教他所能教的所有科目. 2.已聘老师必须选,候选老师可选可不选. 3.dfs(cur, subject1, subject2)---求出在当前已选cur个老师,有一个老师教的科目状态为 subject1,有两个及以上老师教的科目状态为 subject2的情况下,最少的雇佣费用. dp[cur][subje