题目:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=20&page=show_problem&problem=1758

状态压缩的DP,dp[i][st]表示状态为st考虑后面i个人所有人最小花费,

因为每个科目有三种状态,可以用一个三进制数表示,

状态不是很多,所以可以把预先把每个数的三进制预处理出来,

决策为选和不选。

#include<bits/stdc++.h>
using namespace std;
const int maxs = ;
const int MAXSTA = +;
const int maxn = ;
int base[maxs+],trp[MAXSTA][maxs+];
int dp[maxn][MAXSTA];
int tch[maxn],cost[maxn],sa;
int s,m,n;
const int INF = 0x3fffffff;
void preDeal()
{
base[] = ;
for(int i = ; i <= maxs; i++){
base[i] = *base[i-];
}
for(int i = ; i < MAXSTA; i++){
int x = i, cnt = ;
while(x){
trp[i][cnt++] = x%;
x /= ;
}
}
} int dfs(int i,int st)
{
if(i == n) return st == sa? :INF;
int &ans = dp[i][st];
if(~ans) return ans;
ans = dfs(i+,st);
//int nst = st;
for(int j = ; j < s; j++){
if(trp[tch[i]][j] && trp[st][j] != ){
st += base[j];
}
}
ans = min(ans,dfs(i+,st)+cost[i]);
return ans;
} int work()
{
sa = base[s]-;
int st = ,sum = ;
for(int i = ; i < m; i++){
int c; scanf("%d",&c);
sum += c;
while(getchar()!='\n'){
int sub = getchar()-'';
int t = trp[st][sub] ;
if(t != ){
st += base[sub];
}
}
}
for(int i = ; i < n; i++){
scanf("%d",cost+i);
tch[i] = ;
while(getchar()!='\n'){
tch[i] += base[getchar()-''];
}
}
memset(dp,-,sizeof(dp));
return sum + dfs(,st);
} int main()
{
//freopen("in.txt","r",stdin);
preDeal();
while(scanf("%d%d%d",&s,&m,&n),s){
printf("%d\n",work());
}
return ;
}

UVA 10817 - Headmaster's Headache(三进制状压dp)的更多相关文章

  1. ZRDay6A. 萌新拆塔(三进制状压dp)

    题意 Sol 这好像是我第一次接触三进制状压 首先,每次打完怪之后吃宝石不一定是最优的,因为有模仿怪的存在,可能你吃完宝石和他打就GG了.. 因此我们需要维护的状态有三个 0:没打 1:打了怪物 没吃 ...

  2. HDU 3001 三进制状压DP

    N个城市,M条道路,每条道路有其经过的代价,每一个城市最多能够到达两次,求走全然部城市最小代价,起点随意. 三进制状压.存储每一个状态下每一个城市经过的次数. 转移方程: dp[i+b[k]][k]= ...

  3. hdu 3001 Travelling 经过所有点(最多两次)的最短路径 三进制状压dp

    题目链接 题意 给定一个\(N\)个点的无向图,求从任意一个点出发,经过所有点的最短路径长度(每个点至多可以经过两次). 思路 状态表示.转移及大体思路 与 poj 3311 Hie with the ...

  4. Travelling (三进制+状压dp)

    题目链接 #include <bits/stdc++.h> using namespace std; typedef long long ll; inline ll read(){ ,f= ...

  5. HDU - 3001 Travelling(三进制状压dp)

    Travelling After coding so many days,Mr Acmer wants to have a good rest.So travelling is the best ch ...

  6. HDU 3001 三进制 状压dp

    Travelling Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  7. 状压DP UVA 10817 Headmaster's Headache

    题目传送门 /* 题意:学校有在任的老师和应聘的老师,选择一些应聘老师,使得每门科目至少两个老师教,问最少花费多少 状压DP:一看到数据那么小,肯定是状压了.这个状态不好想,dp[s1][s2]表示s ...

  8. 三进制状压 HDOJ 3001 Travelling

    题目传送门 题意:从某个点出发,所有点都走过且最多走两次,问最小花费 分析:数据量这么小应该是状压题,旅行商TSP的变形.dp[st][i]表示状态st,在i点时的最小花费,用三进制状压.以后任意进制 ...

  9. Codeforces Round #297 (Div. 2) [ 折半 + 三进制状压 + map ]

    传送门 E. Anya and Cubes time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

随机推荐

  1. A - Alyona and Numbers

    Description After finishing eating her bun, Alyona came up with two integers n and m. She decided to ...

  2. SourceTree切换语言

    点击ok,重启SourceTree即生效 over!over!over!

  3. POJ1111【BFS】

    在搜1011的时候误搜了1111,简单BFS吧,多一个X就是多四个面,每次看看他的四个面有多少个重复的,然后剪掉,最后答案加上就好了: code: //#include <bits/stdc++ ...

  4. thinkphp5.0 页面缓存

    在application\config.php里加 //以下为静态缓存配置 'app_debug' => false,//false为开启静态缓存模式 'html_cache_on' => ...

  5. Unity手游之路游戏摇杆之Easy Touch 3教程

    之前已经介绍过Unity自带的摇杆Joystick,它用起来很简单.但是它也存在很多局限,不能全部满足普通mmo手游的一些需求,例如:要能方便地更好素材:能指定在某个区域显示,或者只有在该区域触摸时才 ...

  6. 2014-5-16 NOIP模拟赛

    Problem 1 抓牛(catchcow.cpp/c/pas) [题目描述] 农夫约翰被通知,他的一只奶牛逃逸了!所以他决定,马上出发,尽快把那只奶牛抓回来. 他们都站在数轴上.约翰在N(O≤N≤1 ...

  7. jzoj5989. 【北大2019冬令营模拟2019.1.6】Forest (set)

    题面 题解 为了一点小细节卡了一个下午--我都怕我瞎用set把电脑搞炸-- 观察一次\(1\)操作会造成什么影响,比如说把\(A[i]\)从\(x\)改成\(y\): \(D[x]\)会\(-1\), ...

  8. 【渗透测试】如何使用burpsuite对特殊密码进行爆破

    爆破是渗透测试中必不可少的一部分,对于没有太大价值可利用的漏洞或是业务只有一个登陆页面时,爆破更是我们的最合适的选择.那么在爆破时,抛去目标系统对爆破频率的限制,如果遇到较为复杂的密码,该如何顺利进行 ...

  9. JDBC连接池一 自定义连接池

    package com.mozq.jdbc; import java.io.IOException; import java.io.InputStream; import java.sql.Conne ...

  10. 51 Nod 1640 天气晴朗的魔法( Kruskall )

    #include <bits/stdc++.h> typedef long long LL; using namespace std; ; struct node{ LL u,v,w; n ...