【状压dp】Bzoj1294 围豆豆
题目

Input
第一行两个整数N和M,为矩阵的边长。 第二行一个整数D,为豆子的总个数。 第三行包含D个整数V1到VD,分别为每颗豆子的分值。 接着N行有一个N×M的字符矩阵来描述游戏矩阵状态,0表示空格,#表示障碍物。而数字1到9分别表示对应编号的豆子。
Output
仅包含一个整数,为最高可能获得的分值。
Sample Input
3 8
3
30 -100 30
00000000
010203#0
00000000
Sample Output
38
Hint
50%的数据满足1≤D≤3。 100%的数据满足1≤D≤9,1≤N, M≤10,-10000≤Vi≤10000。
分析
首先考虑一下点被包围的情况,在网上看到了一种不错的方法,也就是射线法。也就是从一个点向右做一条射线,如果与路线的交点个数为奇数,则这个点一定被围起来了。下边有几个图加强一下理解:



到这里我们可以看到如果交点奇数个,那么这个点就是被围起来的,反之则没有被围起来。

这个是一种特殊的情况,如果两条相交的边是同向的,那么也有可能包围这个点。于是乎我们就可以将射线向下移动半格。
因为这个转移是存在环的,所以选择spfa
代码
1 #include <cstdio>
2 #include <cstring>
3 #include <iostream>
4 #include <queue>
5 using namespace std;
6 const int maxn=(1<<9)+3;
7 int f[10][10][maxn],val[maxn];
8 int inq[10][10][maxn],v[10],tr[10][10],dx[]={1,0,-1,0},dy[]={0,1,0,-1};
9 char s[10][10];
10 queue<int> q1,q2,q3;
11 int n,m,K,ans;
12 int main()
13 {
14 scanf("%d%d%d",&n,&m,&K);
15 int i,j,k,S,T,a,b,c,d;
16 for(i=0;i<K;i++)scanf("%d",&v[i]);
17 for(i=1;i<(1<<K);i++){
18 for(j=0;j<K;j++)
19 if((i>>j)&1){
20 val[i]=val[i^(1<<j)]+v[j];
21 break;
22 }
23 }//射线法找围住的点
24 for(i=0;i<n;i++){
25 scanf("%s",s[i]);
26 S=0;
27 for(j=0;j<m;j++){
28 if(s[i][j]>='1'&&s[i][j]<='9') S|=1<<(s[i][j]-'1');
29 tr[i][j]=S;
30 }
31 }//spfa
32 for(i=0;i<n;i++)
33 for(j=0;j<m;j++)
34 if(s[i][j]=='0'){
35 memset(f,0x3f,sizeof(f));
36 f[i][j][0]=0;
37 q1.push(i),q2.push(j),q3.push(0);
38 while(!q1.empty()){
39 a=q1.front(),b=q2.front(),S=q3.front(),inq[a][b][S]=0,q1.pop(),q2.pop(),q3.pop();
40 if(a==i&&b==j){
41 ans=max(ans,val[S]-f[a][b][S]);//用f[a][b][S]表示当前走到(a,b),已经围住的豆豆状态为S的最短路
42 }
43 for(k=0;k<4;k++){
44 c=a+dx[k],d=b+dy[k];
45 if(c<0||c==n||d<0||d==m||s[c][d]!='0') continue;
46 T=S;
47 if(k==0)T^=tr[a][b];
48 if(k==2)T^=tr[c][d];
49 if(f[c][d][T]>f[a][b][S]+1){
50 f[c][d][T]=f[a][b][S]+1;
51 if(!inq[c][d][T]) inq[c][d][T]=1,q1.push(c),q2.push(d),q3.push(T);
52 }
53 }
54 }
55 }
56 printf("%d",ans);
57 return 0;
58 }
(PS:这道题本人还不是理解的特别透彻,只是大致理解了思路和做法,代码的内容还要细细钻研琢磨。)
【状压dp】Bzoj1294 围豆豆的更多相关文章
- CDOJ 1402 三角形棋盘上的博弈游戏 状压DP
三角形棋盘上的博弈游戏 题目连接: http://mozhu.today/#/problem/show/1402 Description 柱爷有天上课无聊,于是和同桌卿学姐一起下一种奇特的棋: 棋盘如 ...
- 【[APIO/CTSC2007]动物园】状压DP
题目测评:https://www.luogu.org/problemnew/show/P3622 题目描述 新建的圆形动物园是亚太地区的骄傲.圆形动物园坐落于太平洋的一个小岛上,包含一大圈围栏,每个围 ...
- UVa 1204 Fun Game (状压DP)
题意:有一些小孩(至少两个)围成一圈,有 n 轮游戏,每一轮从某个小孩开始往左或者往右伟手帕,拿到手帕写上自己的性别(B,G),然后以后相同方向给下一个. 然后在某个小孩结束,给出 n 轮手帕上的序列 ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- nefu1109 游戏争霸赛(状压dp)
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...
- poj3311 TSP经典状压dp(Traveling Saleman Problem)
题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...
- [NOIP2016]愤怒的小鸟 D2 T3 状压DP
[NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...
- 【BZOJ2073】[POI2004]PRZ 状压DP
[BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...
- bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)
数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...
- HDU 1074 Doing Homework (状压dp)
题意:给你N(<=15)个作业,每个作业有最晚提交时间与需要做的时间,每次只能做一个作业,每个作业超出最晚提交时间一天扣一分 求出扣的最小分数,并输出做作业的顺序.如果有多个最小分数一样的话,则 ...
随机推荐
- Java实现 LeetCode 557 反转字符串中的单词 III(StringBuilder的翻转和分割)
557. 反转字符串中的单词 III 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. 示例 1: 输入: "Let's take LeetCode c ...
- Java实现 LeetCode 513 找树左下角的值
513. 找树左下角的值 给定一个二叉树,在树的最后一行找到最左边的值. 示例 1: 输入: 2 / \ 1 3 输出: 1 示例 2: 输入: 1 / \ 2 3 / / \ 4 5 6 / 7 输 ...
- Java实现堆排序问题(变治法)
问题描述 用基于变治法的堆排序算法对任意一组给定的数据进行排序 2.1 堆排序原理简介 堆可以定义为一颗二叉树,树的节点中包含键(每个节点是一个键),并且满足下面两个条件: (1)树的形状要求--这颗 ...
- webpack从单页面到多页面
前言 从上次更完webpack从什么都不懂到入门之后,好久没有更新过文章了,可能是因为自己懒了吧.今天看了下自己的索引量少了一半o(╥﹏╥)o,发现事态严重,赶紧更新一篇23333 也是因为最近踩了一 ...
- leetcode之两数相加解题思路
问题描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元素不能使 ...
- 【Spring注解驱动开发】自定义TypeFilter指定@ComponentScan注解的过滤规则
写在前面 Spring的强大之处不仅仅是提供了IOC容器,能够通过过滤规则指定排除和只包含哪些组件,它还能够通过自定义TypeFilter来指定过滤规则.如果Spring内置的过滤规则不能够满足我们的 ...
- 手把手带你入门numpy,从此数据处理不再慌【四】
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是numpy专题的第四篇文章,numpy中的数组重塑与三元表达式. 首先我们来看数组重塑,所谓的重塑本质上就是改变数组的shape.在保 ...
- 数据结构与算法-python描述-单向循环链表
# coding:utf-8 # 单向循环链表的相关操作: # is_empty() 判断链表是否为空 # length() 返回链表的长度 # travel() 遍历 # add(item) 在头部 ...
- Centos 7 k8s Deployment新副本控制器
一.概念 Kubernetes提供了一种更加简单的更新RC和Pod的机制,叫做Deployment.通过在Deployment中描述你所期望的集群状态,Deployment Controller会将在 ...
- Redis PHP扩展安装步骤
### 下载最新的扩展文件,解压并进入文件夹 wget https://codeload.github.com/phpredis/phpredis/tar.gz/2.2.7 tar -zxvf 2.2 ...