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 ...
随机推荐
- myeclipse同时部署两个项目-permgen space
黑色头发:http://heisetoufa.iteye.com/ 使用myeclipse启动两个SSH2的部署在tomcat6下的项目报出java.lang.OutOfMemoryError: Pe ...
- DOM学习笔记(二)对象方法与属性
所有 HTML 元素被定义为对象,而编程接口(对象的访问)则是对象方法和对象属性. 事实上,常用的只用window对象及其子对象document对象,以及事件Event对象. Window 对象 Wi ...
- 求N!的长度【数学】
转自:http://blog.csdn.net/fengdian29147001/article/details/11992755 给一个数X,len=log10(X)+1就是X这个数的长度 ①:当N ...
- ugui学习资料
官网文档 http://docs.unity3d.com/Manual/index.html 官网视频教程http://unity3d.com/learn/tutorials/modules/begi ...
- 蓝桥杯T42(八数码问题)
题目链接:http://lx.lanqiao.cn/problem.page?gpid=T42 题意:中文题诶- 思路:bfs 将没种九宫格的状态看作一个状态节点,那么只需求起始节点到目标节点的最短路 ...
- [Xcode 实际操作]一、博主领进门-(10)Xcode右侧界面介绍
目录:[Swift]Xcode实际操作 本文将演示Xcode右侧界面介绍. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] 右上角第三个[辅助编辑器]按钮,将代码切 ...
- [Xcode 实际操作]八、网络与多线程-(11)使用同步Post方式查询IP地址信息
目录:[Swift]Xcode实际操作 本文将演示如何通过Post请求,同步获取IP地址信息. 一旦发送同步请求,程序将停止用户交互,直至服务器返回数据. 在项目导航区,打开视图控制器的代码文件[Vi ...
- Proteomes of paired human cerebrospinal fluid and plasma: Relation to blood-brain barrier permeability in older adults (文献分享一组-潘火珍)
题目:Proteomes of paired human cerebrospinal fluid and plasma: Relation to blood-brain barrier permeab ...
- js对象—类型和属性特性
前言 权威指南中摘要的,工作中用不到的,重要的js基础. 三类对象两类属性 内置对象(native object) 是由ECMScript规范定义的对象或者类.例如:函数,数组,日期,正则... 宿主 ...
- 解决XP“不是有效Win32程序” 不是改Platform toolset
背景 最近在写一个窗口程序,想在Windows XP上也能跑.先用vs 2015的App Wizard生成了一个实例窗口程序,按照网上大部分攻略,将 "Properties - Genera ...