【BZOJ1294】[SCOI2009]围豆豆Bean

Description

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。

题解:我们可以枚举起点,用f[a][b][S]表示当前走到(a,b),已经围住的豆豆状态为S的最短路。转移因为存在环,所以要用SPFA。但是问题在于,如何判断一个豆豆是否被我们围住了呢?

这里采用射线法:我们从每个豆豆向右引一条射线,如果这条射线与路径有奇数个交点则被围住,否则不被围住。但是可能存在我们顺着射线走的情况。于是将射线向下移动半格即可。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
const int maxn=(1<<9)+3;
int f[10][10][maxn],val[maxn];
int inq[10][10][maxn],v[10],tr[10][10],dx[]={1,0,-1,0},dy[]={0,1,0,-1};
char s[10][10];
queue<int> q1,q2,q3;
int n,m,K,ans;
int main()
{
scanf("%d%d%d",&n,&m,&K);
int i,j,k,S,T,a,b,c,d;
for(i=0;i<K;i++) scanf("%d",&v[i]);
for(i=1;i<(1<<K);i++)
{
for(j=0;j<K;j++) if((i>>j)&1)
{
val[i]=val[i^(1<<j)]+v[j];
break;
}
}
for(i=0;i<n;i++)
{
scanf("%s",s[i]);
S=0;
for(j=0;j<m;j++)
{
if(s[i][j]>='1'&&s[i][j]<='9') S|=1<<(s[i][j]-'1');
tr[i][j]=S;
}
}
for(i=0;i<n;i++) for(j=0;j<m;j++) if(s[i][j]=='0')
{
memset(f,0x3f,sizeof(f));
f[i][j][0]=0;
q1.push(i),q2.push(j),q3.push(0);
while(!q1.empty())
{
a=q1.front(),b=q2.front(),S=q3.front(),inq[a][b][S]=0,q1.pop(),q2.pop(),q3.pop();
if(a==i&&b==j)
{
ans=max(ans,val[S]-f[a][b][S]);
}
for(k=0;k<4;k++)
{
c=a+dx[k],d=b+dy[k];
if(c<0||c==n||d<0||d==m||s[c][d]!='0') continue;
T=S;
if(k==0) T^=tr[a][b];
if(k==2) T^=tr[c][d];
if(f[c][d][T]>f[a][b][S]+1)
{
f[c][d][T]=f[a][b][S]+1;
if(!inq[c][d][T]) inq[c][d][T]=1,q1.push(c),q2.push(d),q3.push(T);
}
}
}
}
printf("%d",ans);
return 0;
}

【BZOJ1294】[SCOI2009]围豆豆Bean 射线法+状压DP+SPFA的更多相关文章

  1. [BZOJ1294][SCOI2009]围豆豆Bean 射线法+状压dp+spfa

    1294: [SCOI2009]围豆豆Bean Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 458  Solved: 305[Submit][Sta ...

  2. 【BZOJ1294】[SCOI2009]围豆豆(动态规划,状压)

    [BZOJ1294][SCOI2009]围豆豆(动态规划,状压) 题面 BZOJ 洛谷 题解 首先考虑如何判断一个点是否在一个多边形内(不一定是凸的),我们从这个点开始,朝着一个方向画一条射线,看看它 ...

  3. BZOJ1294: [SCOI2009]围豆豆Bean

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1294 状压dp,dis[s][i][j]表示从(i,j)出发围的状态是s的最短路. 然后判断一 ...

  4. bzoj1294 [SCOI2009]围豆豆

    Description Input 第一行两个整数N和M,为矩阵的边长. 第二行一个整数D,为豆子的总个数. 第三行包含D个整数V1到VD,分别为每颗豆子的分值. 接着N行有一个N×M的字符矩阵来描述 ...

  5. HDU 4284 状压dp+spfa

    题意: 给定n个点 m条无向边 d元. 以下m行表示每条边 u<=>v 以及花费 w 以下top 以下top行 num c d 表示点标为num的城市 工资为c 健康证价格为d 目标是经过 ...

  6. 洛谷P2761 软件补丁问题(状压DP,SPFA)

    题意 描述不清... Sol 网络流24题里面怎么会有状压dp?? 真是狗血,不过还是简单吧. 直接用$f[sta]$表示当前状态为$sta$时的最小花费 转移的时候枚举一下哪一个补丁可以搞这个状态 ...

  7. 洛谷P2566 [SCOI2009]围豆豆(状压dp+spfa)

    题目传送门 题解 Σ(っ °Д °;)っ 前置知识 射线法:从一点向右(其实哪边都行)水平引一条射线,若射线与路径的交点为偶数,则点不被包含,若为奇数,则被包含.(但注意存在射线与路径重合的情况) 这 ...

  8. BZOJ 1294 [SCOI2009]围豆豆Bean ——计算几何

    显然我们不可能表示出一台路径,因为实在是太复杂了. 所以我们可以记录一下路径对答案的影响,显然路径对答案影响相同的时候,答案更优,所以我们可以用影响来代替路径. 所以我们考虑状压一下所有的豆子有没有被 ...

  9. 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)

    2595: [Wc2008]游览计划 Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 1572  Solved: 7 ...

随机推荐

  1. HTML5 touche vents drag to move & AF actionsheet by longTap

    $('img').on("touchstart",function(E){ //E.preventDefault();E.stopPropagation(); var el=thi ...

  2. IT建设如何面对“短板”和“孤峰”?

    在与很多企业探讨信息化建设时,很多IT负责人都提出过一个问题,企业信息化建设的资源是有限的,信息化的资源是先强化企业的“孤峰”还是先支持“短板”?   企 业虽说是一个整体,但不同的领域如研发.生产. ...

  3. VS或编译的时候不生成Release文件夹

    今天在编译第三方类的时候,总是发布的时候报没有第三方类库的的Release版本 解决方案: Build=>Configuration Manager=>Release 编译=>配置管 ...

  4. javascript生成m位随机数

    根据时间生成m位随机数,最大13位随机数,并且不能保证首位不为0 function ran(m) { m = m > 13 ? 13 : m; var num = new Date().getT ...

  5. [Bayesian] “我是bayesian我怕谁”系列 - Exact Inference

    要整理这部分内容,一开始我是拒绝的.欣赏贝叶斯的人本就不多,这部分过后恐怕就要成为“从入门到放弃”系列. 但,这部分是基础,不管是Professor Daphne Koller,还是统计学习经典,都有 ...

  6. CentOS7上Redis安装与配置

    一.redis安装(注意:最好先安装一遍gcc->yum -y install gcc:如果系统本身缺少,make时候会出错,后期修改稍麻烦) 1.wget命令下载 wget http://do ...

  7. mybayis 之resultType="map"

    List<Map> publishInfos = memberShareMapper.shareToCouponCountGroupByPublishId(memberShare.getA ...

  8. java虚拟机性能监控调优及原则

    摘抄 http://uule.iteye.com/blog/2114697 一.JVM内存模型及垃圾收集算法  1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老 ...

  9. 用Copy命令合并文件

    用Copy命令合并文件 这个文章是在我以前的百度空间里面发表过的,后来因为某个内分泌失调的管理员把我的空间http://hi.baidu.com/kamdy   封了! 旧事不提,还是回到主题吧,这个 ...

  10. 使用filezilla连接树莓派失败

    报错: 错误: Network error: Connection refused 错误: 无法连接到服务器 原因是新版的树莓派系统默认关闭ssh,进入树莓派打开ssh即可. sudo service ...