【状压dp】校长的烦恼UVA10817

27人阅读 评论(0) 收藏 举报
分类:

又是一道看题就懵逼抄题解的题

每个状态可以用三个集合表示,没有人教科目集,只有一个人教科目集,至少两人教科目集,可以发现任意两个集合可以推出来第三个,为了方便我选了前两个

然后另一维是当前已经对前i个老师做完决策了,对每个老师有选和不选两种决策,但是前M个必须选。

所以当没人教科目集和只有一人教科目集为空集时和所有老师都考虑完时为边界

怒交一发,不出意外又WA。然后看了一眼debug不过的数据发现,有一种情况是固定教师还没考虑完时已经到边界可以返回零了,但这时要继续向下知道所有固定教师都考虑完,无论他们是否有用都必须聘用

这个读入也是贼坑了,getsCE,只能一个字符一个字符读

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cstdlib>
#define INF (21000010)
using namespace std;
int S,M,N,T[2020],val[2020],A[2020],dp[125][(1<<8)+5][(1<<8)+5];
bool vis[125][(1<<9)+5][(1<<9)+5];
void InIt(){
	memset(T,0,sizeof(T));
	int i,x=0; char ch;
	while (1){
		ch=getchar();
		if (ch=='\n') break;
		if (ch!=' ') x=(x<<3)+(x<<1)+ch-'0';
		else if (x) T[++T[0]]=x,x=0;
	}
	if (x)  T[++T[0]]=x;
}
int Dfs(int i,int s0,int s1){
	int &ans=dp[i][s0][s1];
	if (vis[i][s0][s1]) return ans;
	vis[i][s0][s1]=1;
	if (!s0&&!s1&&i>M) return ans=0;
	//坑点,此处不能直接退,因为固定教师一定要用 
	if (i==N+M+1) return ans=INF;
	
	if (i>M) ans=min(ans,Dfs(i+1,s0,s1));
	int m0=A[i]&s0,m1=A[i]&s1;
	//m0:能使没人教变成有一个人教的科目集合 
	//m1: 能使一个人教变成至少两个人教的科目集合 
	s0^=m0; s1^=m1; s1|=m0; 
	ans=min(ans,Dfs(i+1,s0,s1)+val[i]);
	return ans;
}
void Work(){
	int i,j;
	memset(A,0,sizeof(A));
	memset(vis,0,sizeof(vis));
	memset(dp,127/3,sizeof(dp));
	for (i=1;i<=M+N;i++){
		InIt();
		val[i]=T[1];
		for (j=2;j<=T[0];j++) A[i]|=(1<<(T[j]-1));
	}
	printf("%d\n",Dfs(1,(1<<S)-1,0));//写成(1<<M)-1 
}
int main(){
	while (1){
		scanf("%d %d %d",&S,&M,&N);
		if (!S&&!M&&!N) break;
		char ch=0;
		while (ch!='\n') ch=getchar();
		Work();
	}
} 


查看评论

MFC架构下的DirectX8

MFC架构下的DirectX8第一章 MFC框架(DX8MFC)这里的MFC框架指的是一个符合游戏开发应用的框架,当然你也可以写一个符合你要求的MFC框架。如果你对MFC比较熟悉的话可以直接从第二章开...
  • ghj1976
  • ghj1976
  • 2001-01-15 16:30:00
  • 1679

例题9-15 校长的烦恼 UVa10817

1.题目描述:点击打开链接 2.解题思路:本题利用集合上的动态规划解决。定义集合s1表示恰好有一个人教的课程,集合s2表示至少有两个人教的课程。定义d(i,s1,s2)表示已经考虑了前i个人时的最小...
  • u014800748
  • u014800748
  • 2015-02-16 15:00:01
  • 648

状压DP 入门题

一:方格取数 问题描述: Description 给你一个n*n的格子的棋盘,每个格子里面有一个非负数。 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不...
  • sinat_34336698
  • sinat_34336698
  • 2016-08-06 16:33:58
  • 2660

状压DP小结

状压dp其实就是将状态压缩成2进制来保存 其特征就是看起来有点像搜索,每个格子的状态只有1或0 模板题,poj3254 就是先给一个map,在这个有些地方不能放牛,有些地方可以 然后牛与牛之间...
  • cbcbcbz
  • cbcbcbz
  • 2017-07-23 10:40:15
  • 470

状压DP问题

状态压缩·一题目传送:#1044 : 状态压缩·一AC代码:#include #include #include #include #include #include #include ...
  • u014355480
  • u014355480
  • 2015-08-17 15:00:53
  • 973

一些关于状压dp的题目

有些题目打得比较幼稚。。。 贴这些主要是收集状压Dpjzoj 1340周长:#include #include #include #include using namespace std; ...
  • HownoneHe
  • HownoneHe
  • 2016-05-23 20:46:03
  • 403

状压dp专题----2017.10.1

前言没有前言 T1 Hie with the Pie 题意 解析 代码 提示 出处 T2 Doing Homework 题意 解析 代码 提示 出处 T3 Card Co...
  • qq_39596588
  • qq_39596588
  • 2017-10-08 07:53:20
  • 405

状压DP入门题集锦

POJ 3254 Corn Fields 题意: 一块n*m的田,1表示这个地方可以种植,0代表这个地方不能种植。植物种植还必须满足两株植物不能相邻(横竖都不行)。问共有几种种植方法,而且当...
  • Codeblocksm
  • Codeblocksm
  • 2016-03-05 10:52:18
  • 527

状压dp - 棋盘问题(学习)

转载自:http://blog.csdn.net/math_coder/article/details/9671581 如果看不明白代码的位运算,请先了解下位运算的应用 **********此文章...
  • qq_33199236
  • qq_33199236
  • 2017-02-16 11:26:07
  • 1144

|算法讨论|状压DP/位运算 学习笔记

题目 [状压DP]poj 3311:经典TSP问题模板及讲解状态压缩动态规划就是用于某种时候DP的状态难以表示时,使用二进制进行存储状态的一种动态规划。通常会用位运算进行操作: 位运算: 1、对...
  • Darost
  • Darost
  • 2017-02-12 16:27:20
  • 428
    个人资料
    持之以恒
    等级:
    访问量: 467
    积分: 316
    排名: 25万+
    文章存档
    最新评论