[BZOJ1294][SCOI2009]围豆豆Bean 射线法+状压dp+spfa
1294: [SCOI2009]围豆豆Bean
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 458 Solved: 305
[Submit][Status][Discuss]
Description

Input
Output
Sample Input
3
30 -100 30
00000000
010203#0
00000000
Sample Output
HINT
50%的数据满足1≤D≤3。
100%的数据满足1≤D≤9,1≤N, M≤10,-10000≤Vi≤10000。
从每个豆豆射出一条射线,若经过路线奇数次则说明路线将其包围,若经过偶数次则不包围。
设状态f[i][j][k]表示到达(i,j)围豆豆状态为k的最大价值。
每次枚举起点,用spfa转移即可。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define maxn 15
using namespace std;
int tx[]={,-,,};
int ty[]={,,,-};
char a[maxn];
int num[maxn][maxn];
int val[maxn];
int n,m,d;
int x[maxn],y[maxn];
int f[maxn][maxn][];
int inq[maxn][maxn][];
int ans=;
struct data {
int x,y,z;
}q[];
void work(int i,int j) {
memset(f,-,sizeof(f));
int head=,tail=;
q[]=(data){i,j,};
f[i][j][]=;
while(head!=tail) {
data now=q[head++];if(head==) head=;
if(now.x==i&&now.y==j) ans=max(ans,f[now.x][now.y][now.z]);
for(int k=;k<;k++) {
int tox=now.x+tx[k],toy=now.y+ty[k],toz=now.z;
int add=;
if(tox<||toy<||tox>n||toy>m||num[tox][toy]!=) continue;
if(now.x!=tox) {
data temp;
if(tox>now.x) temp=(data){now.x,now.y,now.z};else temp=(data){tox,toy,now.z};
for(int l=;l<=d;l++) {
if(temp.y>y[l]&&temp.x==x[l]) {
temp.z^=(<<(l-));
if(temp.z&(<<(l-))) add+=val[l];
else add-=val[l];
}
}
toz=temp.z;
}
if(f[tox][toy][toz]<f[now.x][now.y][now.z]+add-){
f[tox][toy][toz]=f[now.x][now.y][now.z]+add-;
if(!inq[tox][toy][toz]) {
q[tail++]=(data){tox,toy,toz};if(tail==) tail=;
inq[tox][toy][toz]=;
}
}
inq[now.x][now.y][now.z]=;
}
}
}
int main() {
scanf("%d%d%d",&n,&m,&d);
for(int i=;i<=d;i++) scanf("%d",&val[i]);
for(int i=;i<=n;i++) {
scanf("%s",a+);
for(int j=;j<=m;j++) {
if(a[j]=='') num[i][j]=;
else if(a[j]!='#') x[a[j]-'']=i,y[a[j]-'']=j,num[i][j]=-;
else num[i][j]=;
}
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(num[i][j]==) work(i,j);
printf("%d",ans);
return ;
}
[BZOJ1294][SCOI2009]围豆豆Bean 射线法+状压dp+spfa的更多相关文章
- 【BZOJ1294】[SCOI2009]围豆豆Bean 射线法+状压DP+SPFA
[BZOJ1294][SCOI2009]围豆豆Bean Description Input 第一行两个整数N和M,为矩阵的边长. 第二行一个整数D,为豆子的总个数. 第三行包含D个整数V1到VD,分别 ...
- 【BZOJ1294】[SCOI2009]围豆豆(动态规划,状压)
[BZOJ1294][SCOI2009]围豆豆(动态规划,状压) 题面 BZOJ 洛谷 题解 首先考虑如何判断一个点是否在一个多边形内(不一定是凸的),我们从这个点开始,朝着一个方向画一条射线,看看它 ...
- BZOJ1294: [SCOI2009]围豆豆Bean
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1294 状压dp,dis[s][i][j]表示从(i,j)出发围的状态是s的最短路. 然后判断一 ...
- bzoj1294 [SCOI2009]围豆豆
Description Input 第一行两个整数N和M,为矩阵的边长. 第二行一个整数D,为豆子的总个数. 第三行包含D个整数V1到VD,分别为每颗豆子的分值. 接着N行有一个N×M的字符矩阵来描述 ...
- HDU 4284 状压dp+spfa
题意: 给定n个点 m条无向边 d元. 以下m行表示每条边 u<=>v 以及花费 w 以下top 以下top行 num c d 表示点标为num的城市 工资为c 健康证价格为d 目标是经过 ...
- 洛谷P2761 软件补丁问题(状压DP,SPFA)
题意 描述不清... Sol 网络流24题里面怎么会有状压dp?? 真是狗血,不过还是简单吧. 直接用$f[sta]$表示当前状态为$sta$时的最小花费 转移的时候枚举一下哪一个补丁可以搞这个状态 ...
- 洛谷P2566 [SCOI2009]围豆豆(状压dp+spfa)
题目传送门 题解 Σ(っ °Д °;)っ 前置知识 射线法:从一点向右(其实哪边都行)水平引一条射线,若射线与路径的交点为偶数,则点不被包含,若为奇数,则被包含.(但注意存在射线与路径重合的情况) 这 ...
- BZOJ 1294 [SCOI2009]围豆豆Bean ——计算几何
显然我们不可能表示出一台路径,因为实在是太复杂了. 所以我们可以记录一下路径对答案的影响,显然路径对答案影响相同的时候,答案更优,所以我们可以用影响来代替路径. 所以我们考虑状压一下所有的豆子有没有被 ...
- 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)
2595: [Wc2008]游览计划 Time Limit: 10 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 1572 Solved: 7 ...
随机推荐
- ElasticSearch学习笔记(五)-- 排序、分页与遍历
1. 相关性算分 这样能够查询到不同分片上的文档的准确算分,默认分片为5 2. sorting-doc-values-fielddata 3. 分页与遍历
- istringstream输入数据到数组
istringstream iss(line); ; while (!(iss >> dat[n]).fail()) n++;
- 玩转Openstack之Nova中的协同并发(二)
玩转Openstack之Nova中的协同并发(二) 昨天介绍了Python中的并发处理,主要介绍了Eventlet,今天就接着谈谈Openstack中Nova对其的应用. eventlet 在nova ...
- Python+Selenium框架设计篇之-什么是POM
前面我们介绍了Python中的单元测试框架unittest,以后我们所有的测试类文件,都采用unittest来辅助我们进行debug和脚本开发.搞定了debug机制和确定了unittest来进行创建和 ...
- day06_01 上节回顾
1.0 extend 扩展方法及"+"的对比 "+"不会改变数组的内容,而extend会改变数组的内容 2.0 sort扩展sorted() a = [1,2, ...
- JAVA相似算法的运用
今天要处理问题是把一个产品的名字按照其内容对比文档转换出它的中文名. 但是这个文档感觉不全,产品种类有多又杂. 如果像这样写的话 if(xxx.contains()) else if() ... 不知 ...
- java单例模式(类只能创建唯一对象)
//饿汉式 class Single { private static final Single s= new Single(); private Single(){} public static S ...
- 条件随机场(Conditional random field)
条件随机场真是把我给折磨坏了啊,本以为一本小小的<统计学习方法>攻坚剩下最后一章,心情还是十分愉悦的,打算一口气把它看完,结果真正啃起来真是无比的艰难啊,每一句对我都好像是天书一般,怎么这 ...
- 推荐系统评测指标--准确率(Precision)和召回率(Recall)、F值(F-Measure)
转自http://bookshadow.com/weblog/2014/06/10/precision-recall-f-measure/ 1,准确率和召回率是广泛应用于信息检索和统计学分类领域的两个 ...
- c#中onclick事件请求的两种区别
在C#中如果是asp控件的button有两个click的调用,一个是OnClick,一个是OnClientClick.那么这两者有什么区别呢,下面就来说说区别. <asp:Button ID=& ...