UVA 10817 - Headmaster's Headache(三进制状压dp)
状态压缩的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)的更多相关文章
- ZRDay6A. 萌新拆塔(三进制状压dp)
题意 Sol 这好像是我第一次接触三进制状压 首先,每次打完怪之后吃宝石不一定是最优的,因为有模仿怪的存在,可能你吃完宝石和他打就GG了.. 因此我们需要维护的状态有三个 0:没打 1:打了怪物 没吃 ...
- HDU 3001 三进制状压DP
N个城市,M条道路,每条道路有其经过的代价,每一个城市最多能够到达两次,求走全然部城市最小代价,起点随意. 三进制状压.存储每一个状态下每一个城市经过的次数. 转移方程: dp[i+b[k]][k]= ...
- hdu 3001 Travelling 经过所有点(最多两次)的最短路径 三进制状压dp
题目链接 题意 给定一个\(N\)个点的无向图,求从任意一个点出发,经过所有点的最短路径长度(每个点至多可以经过两次). 思路 状态表示.转移及大体思路 与 poj 3311 Hie with the ...
- Travelling (三进制+状压dp)
题目链接 #include <bits/stdc++.h> using namespace std; typedef long long ll; inline ll read(){ ,f= ...
- HDU - 3001 Travelling(三进制状压dp)
Travelling After coding so many days,Mr Acmer wants to have a good rest.So travelling is the best ch ...
- HDU 3001 三进制 状压dp
Travelling Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 状压DP UVA 10817 Headmaster's Headache
题目传送门 /* 题意:学校有在任的老师和应聘的老师,选择一些应聘老师,使得每门科目至少两个老师教,问最少花费多少 状压DP:一看到数据那么小,肯定是状压了.这个状态不好想,dp[s1][s2]表示s ...
- 三进制状压 HDOJ 3001 Travelling
题目传送门 题意:从某个点出发,所有点都走过且最多走两次,问最小花费 分析:数据量这么小应该是状压题,旅行商TSP的变形.dp[st][i]表示状态st,在i点时的最小花费,用三进制状压.以后任意进制 ...
- Codeforces Round #297 (Div. 2) [ 折半 + 三进制状压 + map ]
传送门 E. Anya and Cubes time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
随机推荐
- SSE2 Intrinsics各函数介绍
http://blog.csdn.net/fengbingchun/article/details/18460199
- UVa 10723 Cyborg Genes (LCS, DP)
题意:给定两行字符串,让你找出一个最短的序列,使得这两个字符串是它的子串,并且求出有多少种. 析:这个题和LCS很像,我们就可以利用这个思想,首先是求最短的长度,不就是两个字符串长度之和再减去公共的么 ...
- linux tar命令及解压总结
把常用的tar解压命令总结下,当作备忘: tar -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其 ...
- Flex AIR组件
1.FileSystemComboBox .directory = File.appli / desk/doc / directoryChange 2.FileSystemTree可返回 好用 ...
- FLINK源代码调试方式
此文已由作者岳猛授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 第一种,直接通过IDEA WINDOWS调试 前提是Flink所有依赖已经导入,直接在Test中打断点,然后直 ...
- E20190402-hm
porxy n. 代理服务器; 代表权; 代理人,代替物; 委托书; enroll v. 招收; 注册; 登记; 加入; enrollment n. 注册; 登记; 入会;
- [WIP]用已有db进行rails开发
创建: 2019/01/16 晚点补上 https://qiita.com/edo1z/items/a0bf22b294406f00ec7c https://qiita.com/kentosasa/i ...
- hdu5883【欧拉通路】
题意:n个点m条无向边的图,找一个欧拉通路/回路,下标是p1,p2,p3-pt,然后使得ap1XORap2XOR-XORapt这个值最大. 思路: 首先要判断一下这个图是不是联通的,用并查集就好了,然 ...
- SpringBoot | 查看默认版本配置
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot ...
- javascript高级程序设计学习笔记
javascript高级程序设计,当枕头书已经好久了~zz 现在觉得自己在js的开发上遇到了一些瓶颈,归根究底还是基础太薄弱,所以重新刷一遍js高程希望有更新的认识. 一.javascript简介 ...