题目: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. JDK1.8中对hashmap的优化

    在Java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外.HashMap实际上是一个“链表散列”的数据结 ...

  2. Asset Catalog Help (八)---Customizing Image Sets for Devices

    Customizing Image Sets for Devices Add images to a set that are customized for display on the device ...

  3. sql语句之约束条件

    not null约束,需设置默认值 sex enum('male','female') not null default 'male' unique 约束,值唯一 单列唯一: create table ...

  4. monkeyRunner

    MonkeyRunner工具是使用Jython(使用Java编程语言实现的Python)写出来的,它提供了多个API,通过monkeyrunner API 可以写一个Python的程序来模拟操作控制A ...

  5. 技术胖Flutter第三季-17布局PositionedWidget层叠定位组件

    博客地址: https://jspang.com/post/flutter3.html#toc-d7a 把我们上节的 Container的部分代码去掉. 使用:Positioned 有点像css里面的 ...

  6. 20个Flutter实例视频教程-第12节: 流式布局 模拟添加照片效果

    视频地址: https://www.bilibili.com/video/av39709290/?p=12 博客地址: https://jspang.com/post/flutterDemo.html ...

  7. Flutter实战视频-移动电商-47.详细页_Flutter_html插件的使用

    47.详细页_Flutter_html插件的使用 详情里面是hemlt和图片组成的,但是flutter是不支持html的所以需要其他插件 flutter webview plugin:这个不太好用 f ...

  8. Git 移除某些文件

    一.前言 在使用 Git 版本控制中,有些文件是不需要加入到版本控制中的.如 日志( log ).编译的文件.这些随时都在变的文件,使用用一个代码库的用户.只要稍稍修改一点,或者启动一下,就会变.容易 ...

  9. 升级到Angular6后对老版本的RXJS代码做相应的调整

    还没有了解过RXJS6的童鞋,可以查看我的另外一篇博文,此篇博文主要是对于RXJS5升级到RXJS6的代码调整示例 RXJS5版本 在RXJS5上我们是这样写请求的 import 'rxjs/add/ ...

  10. Python小爬虫,用Python3.X编写

    import urllib.request # 导入urlib.request模块import re # 导入re模块 # 获得每一页的网址并返回def get_url(pageNumber): ne ...