题意:大白P95

本题比较特别的是状压两个集合并且进行转移,因此要分别处理当前集合只有1个老师/2个老师的记录(然后可O(1)得出0个老师的集合)

记忆化过了但是迭代式不能记忆超过2的之前的状态是怎样的,除非多记录一个超过2的集合,因此无法实现(是我太菜了)

PS.偶然发现一个现象,当数组开的过大时效率会变得十分低下

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<sstream>
#define rep(i,j,k) for(register int i=j;i<=k;i++)
#define rrep(i,j,k) for(register int i=j;i>=k;i--)
using namespace std;
const int maxn = 1e5+11;
typedef long long ll;
int s,m,n,a[maxn],aa[maxn],b[maxn],bb[maxn];
bool vis[maxn];
ll dp[123][1<<8|1][1<<8|1];//m teachers S subjects 1person 2person
ll DP(int cur,int S1,int S2){
if(cur>m+n)return S2==(1<<s)-1?0:1ll<<33;
if(~dp[cur][S1][S2]) return dp[cur][S1][S2];
int x=S1|b[cur];
int all=(1<<s)-1;
ll ans=1ll<<33;
if(cur>m) ans=DP(cur+1,S1,S2);
ans=min(ans,DP(cur+1,S1-(S1&b[cur])+(all&b[cur]),S2|(S1&b[cur]))+a[cur]);
return dp[cur][S1][S2]=ans;
}
int main(){
while(cin>>s>>m>>n){
if(s==0) break;
rep(i,1,m+n){
scanf("%d",&a[i]);
int t=0;char ch;
while(ch=getchar()){
if(ch>='0'&&ch<='9')t|=1<<(ch-'0'-1);
else if(ch=='\n'||ch==EOF)break;
}
b[i]=t;
}
// rep(i,1,n+m)cout<<b[i]<<" ";cout<<endl;
// memset(dp,0x3f,sizeof dp);
// memset(dp[0],0,sizeof dp[0]);
// for(int i=1;i<=m+n;i++){
// for(int S=0;S<=(1<<s)-1;S++){//two or one course
// for(int S0=S;S0;S0=(S0-1)&S){// one
// int one=S0,two=S^S0,zero=((1<<s)-1)^S;
// int x=zero&b[i],y=one&b[i],z=two&b[i];
// if(i<=m){
// dp[i][one][two]=dp[i-1][zero&b[i]][y|two]+a[i];
// }else{
// dp[i][one][two]=dp[i-1][zero&b[i]][y|two]+a[i];
// dp[i][one][two]=min(dp[i][one][two],dp[i-1][one][two]);
// }
// }
// }
// }
// cout<<dp[n+m][0][(1<<s)-1]<<endl;
memset(dp,-1,sizeof dp);
cout<<DP(0,0,0)<<endl;
}
return 0;
}

UVA - 10817 状压DP的更多相关文章

  1. UVa 10817 (状压DP + 记忆化搜索) Headmaster's Headache

    题意: 一共有s(s ≤ 8)门课程,有m个在职教师,n个求职教师. 每个教师有各自的工资要求,还有他能教授的课程,可以是一门或者多门. 要求在职教师不能辞退,问如何录用应聘者,才能使得每门课只少有两 ...

  2. UVa 11825 (状压DP) Hackers' Crackdown

    这是我做状压DP的第一道题,状压里面都是用位运算来完成的,只要耐下心来弄明白每次位运算的含义,还是容易理解的. 题意: 有编号为0~n-1的n台服务器,每台都运行着n中服务,每台服务器还和若干台其他服 ...

  3. UVa 1252 (状压DP + 记忆化搜索) Twenty Questions

    题意: 有n个长为m的各不相同的二进制数(允许存在前导0),别人已经事先想好n个数中的一个数W,你要猜出这个数. 每次只可以询问该数的第K为是否为1. 问采用最优询问策略,则最少需要询问多少次能保证猜 ...

  4. Hackers' Crackdown( UVA UVA 11825状压dp)

    题意:N台电脑,现在有N种服务,现在你可以在每台电脑终止一项服务,他和他相邻的电脑都会被关闭,如果一项服务在所有电脑都没运行,该项服务成功被破坏,问最多能破坏几种服务. 分析:把n个集合分成尽量多组, ...

  5. UVA - 11795 状压DP

    #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #i ...

  6. UVA - 11825 状压DP

    该题目是EMAXX推荐的练习题,刘汝佳的书也有解说 如果S0属于全集,那S0就可以作为一个分组,那么S分组数可以是best{当前S中S0的补集+1} 对于集合类的题目我觉得有点抽象,希望多做多理解把 ...

  7. UVa 11795 状压DP Mega Man's Mission

    kill[S]表示消灭机器人的集合为S,剩下的所能杀死的机器人集合. 设d(S)表示杀死机器人集合为S的方法数,答案为d((1<<n) - 1). d(S)可以由d(S')转移过来,其中S ...

  8. UVa 12235 状压DP Help Bubu

    题解戳这 一开始没看懂题解,后来想明白以后,d(i, j, s, x)是考虑第i本书的时候,前面已经拿走了j本书,剩下的书的种类的二进制状态为s,剩下的最后一本书的编号为x,所能得到的最小混乱度. 这 ...

  9. 状压DP UVA 10817 Headmaster's Headache

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

随机推荐

  1. ubuntu16.04 ARM平台移植xmlrpc-c1.39.12

    1. xmlrpc-c依赖与libcurl 参考另外一篇随笔:https://www.cnblogs.com/flyinggod/p/10148228.html 2. 下载源代码 http://xml ...

  2. atom markdown报错:AssertionError: html-pdf: Failed to load PhantomJS module.

    今天安装markdown-pdf之后运行的时候报错: AssertionError: html-pdf: Failed to load PhantomJS module. You have to se ...

  3. [GO]数组指针做函数参数

    package main import "fmt" //p指向实现数组a,它是指向数组,它是数组指针//*p指向指针指向的内存,就是实参a func modify1(p *[]in ...

  4. location.replace() keeps the history under control

    from https://dev.opera.com/articles/efficient-javascript Occasionally, it is necessary to change the ...

  5. C# 操作Excel基础篇(读取Excel、写入Excel)

    注意事项:Excel的数据表中最多只能储存65535行数据,超出后,需要将数据分割开来进行储存.同时对于Excel中的乱码象限,是由于编码的错误方式导致引起的! 一.读取Excel数据表,获得Data ...

  6. JQuery解决事件动画重复问题

    开发项目时,经常要写动画效果,有时候会遇到动画重复问题,例如:当鼠标移动到某个元素上时,执行某个动画,当我鼠标多次移动到该元素时,该动画就要连续执行,那么怎么去解决呢? 话不多说,直接添代码,简单明了 ...

  7. Android Service基本知识总结(一)

    一.简介 Service是Android系统的后台服务组件,适用于开发无界面.长时间运行的应用功能Service特点如下: 没有用户界面 不会轻易被Android系统终止 在系统资源恢复后Servic ...

  8. DB2 函数快速构造测试数据

    函数快速构造测试数据 [案例]使用DB2内置函数快速构造测试数据 无论您是在用原型证明某一概念,还是开发一个全新的应用程序,或者只是学习 SQL,您都需要在您的应用程序上运行测试数据.为了有效地测试应 ...

  9. android 仿QQ气泡聊天界面

    1.现在的QQ,微信等一些APP的聊天界面都是气泡聊天界面,左边是接收到的消息,右边是发送的消息, 这个效果其实就是一个ListView在加载它的Item的时候,分别用了不同的布局xml文件. 2.效 ...

  10. TSQL--时间类型和毫秒数转换

    项目中使用BIGINT来存放时间,以下代码用来转换时间类型和BIGINT类型 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ========= ...