关闭

bzoj 1151: [CTSC2007]动物园zoo 状压dp

标签: 动态规划状压dp
756人阅读 评论(0) 收藏 举报
分类:

       动态规划水题。。

       令f[i][j]表示考虑第1~i个位置,i~i+4位置上面移走或者不移走的状态为j时的最优解。预处理g[i][j]表示在第i位状态为j时的收益,这样就可以O(1)转移了。

       由于题目是环,因此要求首尾的部分状态要重叠;枚举前4位固定不变的状态在进行dp。时间复杂度O(2^4*N*2^5)=O(2^9N)。

       (随手写一发就rk2了什么鬼。。。)

AC代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int n,m,a[50005],f[10005][32],g[10005][32]; bool ok[50005][32];
const int bin[5]={1,2,4,8,16};
int read(){
	int x=0; char cr=getchar();
	while (cr<'0' || cr>'9') cr=getchar();
	while (cr>='0' && cr<='9'){ x=x*10+cr-'0'; cr=getchar(); }
	return x;
}
int main(){
	n=read(); m=read(); int i,j,k,x,y;
	for (i=1; i<=m; i++){
		a[i]=read();
		j=read(); k=read(); x=y=0;
		while (j--) x|=bin[(read()+n-a[i])%n];
		while(k--) y|=bin[(read()+n-a[i])%n];
		for (j=0; j<32; j++)
			if ((j&x) || ((31^j)&y)){ ok[i][j]=1; g[a[i]][j]++; }
	}
	int ans=0;
	for (i=0; i<16; i++){
		memset(f[0],200,sizeof(f[0]));
		f[0][i<<1]=0;
		for (j=1; j<=n; j++)
			for (k=0; k<32; k++) f[j][k]=max(f[j-1][(k&15)<<1],f[j-1][(k&15)<<1|1])+g[j][k];
		ans=max(ans,max(f[n][i<<1],f[n][i<<1|1]));
	}
	printf("%d\n",ans);
	return 0;
}


by lych

2016.6.1

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

HYSBZ 1151 动物园zoo - 状压dp

题目描述题目大意:N个动物围成一个环,有K个小朋友,每个小朋友可以看到五个连续的动物,每个小朋友都有自己喜欢或讨厌的动物,当有一个自己讨厌的动物被移走或能看到一个自己喜欢的动物时,这个小朋友就会高兴。求最优的移走动物的方案,使得最多的小朋友高兴。 分析:dp[i][S]:处理到第i个动物,i~i-3...
  • yuanxinyu402
  • yuanxinyu402
  • 2016-03-20 11:22
  • 197

51Nod 1428 互不重叠的线段的组数

题目: 有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室?  Input 第一行一个正整数n (n <= 10000)代表活动的个数。 第二行到第(...
  • q3818908
  • q3818908
  • 2018-01-15 17:03
  • 32

状压DP 入门题

一:方格取数 问题描述: Description 给你一个n*n的格子的棋盘,每个格子里面有一个非负数。 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大。 Input 包括多个测试实例,每个测试实例包括一个整数n 和n*...
  • sinat_34336698
  • sinat_34336698
  • 2016-08-06 16:33
  • 1013

BZOJ3590【状压DP】

转自:http://blog.csdn.net/Lethelody/article/details/45147055 orz大神凯爷 原文 SNOI2013竟然出了一道很有难度的状压DP.实在是出人意料. 而且网上似乎并没有题解.我就来写一篇好了. HYF菊...
  • qq_34564984
  • qq_34564984
  • 2016-08-27 10:20
  • 894

TSP问题(状压DP求解)

TSP问题即最短旅行商问题,在给定的带权无向图中求得一条最短的哈密顿路.这个问题我们在离散数学课上有讲过,是NPhard但是数据范围较小的时候我们还是可以通过一些算法求得近似解.白书上介绍了一种很经典的状压dp求解方法.  dp[s][v],s表示一个点的集合,这个集合可以是DAG中所有...
  • WeYoungg
  • WeYoungg
  • 2017-03-13 12:41
  • 157

51Nod 1428 互不重叠的线段的组数

题目: 有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室?  Input 第一行一个正整数n (n <= 10000)代表活动的个数。 第二行到第(...
  • q3818908
  • q3818908
  • 2018-01-15 17:03
  • 32

洛谷 1171 售货员的难题 状压DP 解题报告

题目描述某乡有n个村庄(1输入输出格式输入格式:村庄数n和各村之间的路程(均是整数)。输出格式:最短的路程。输入输出样例输入样例#1:3 0 2 1 1 0 2 2 1 0输出样例#1:3 说明输入解释3 {村庄数}0 2 1 {村庄1到各村的路程}1 0 2 {村庄2到各村的路程}2 1 ...
  • Hawo11
  • Hawo11
  • 2017-11-01 19:56
  • 124

炮兵阵地(经典状压dp)(poj 1185) + 状压dp小技巧详解

炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 22809   Accepted: 8829 Description 司令部的将军们...
  • Yyyy_H
  • Yyyy_H
  • 2016-01-27 20:58
  • 647

poj 2411 骨牌覆盖问题 状压dp

题目:点击打开链接 题意:用1*2 的矩形通过组合拼成大矩形,求拼成指定的大矩形有几种拼法 分析: 这题的关键在于什么状态是合法的,可以这样想,用1表示有骨牌覆盖,用0表示空着。在覆盖第i行的时候,那么如果覆盖的状态是合法的,覆盖完后第i-1行必须没有空格了(全是1111),所以...
  • loveyou11111111
  • loveyou11111111
  • 2016-02-27 00:04
  • 489

状态压缩dp入门 (poj3254 Corn Fields)

题目链接:http://poj.org/problem?id=3254 题意:给出一个n行m列的草地,1表示肥沃,0表示贫瘠,现在要把一些牛放在肥沃的草地上,但是要求所有牛不能相邻,问你有多少种放法。 分析:假如我们知道第 i-1 行的所有的可以放的情况,那么对于第 i 行的可以...
  • y990041769
  • y990041769
  • 2014-04-28 19:10
  • 19056
    个人资料
    • 访问:293699次
    • 积分:6979
    • 等级:
    • 排名:第3846名
    • 原创:403篇
    • 转载:0篇
    • 译文:0篇
    • 评论:107条
    文章分类
    最新评论