SCOI 2009 围豆豆(状压DP)
SCOI 2009 围豆豆
题目描述
是不是平时在手机里玩吃豆豆游戏玩腻了呢?最近MOKIA手机上推出了一种新的围豆豆游戏,大家一起来试一试吧。
游戏的规则非常简单,在一个N×M的矩阵方格内分布着D颗豆子,每颗豆有不同的分值Vi。游戏者可以选择任意一个方格作为起始格,每次移动可以随意的走到相邻的四个格子,直到最终又回到起始格。最终游戏者的得分为所有被路径围住的豆豆的分值总和减去游戏者移动的步数。矩阵中某些格子内设有障碍物,任何时刻游戏者不能进入包含障碍物或豆子的格子。游戏者可能的最低得分为0,即什么都不做。
注意路径包围的概念,即某一颗豆在路径所形成的多边形(可能是含自交的复杂多边形)的内部。
输入格式
第一行两个整数N和M,为矩阵的边长。
第二行一个整数D,为豆子的总个数。
第三行包含D个整数V1到VD,分别为每颗豆子的分值。
接着N行有一个N×M的字符矩阵来描述游戏矩阵状态,0表示空格,#表示障碍物。而数字1到9分别表示对应编号的豆子。
输出格式
仅包含一个整数,为最高可能获得的分值
Sample
Input
3 8
3
30 -100 30
00000000
010203#0
00000000
Output
38
Solution
令人头大的一道题
定义数组:\(f[i][j][k]\)表示当前所在点为\(i,j\)走过了\(k\)步
k就是状压中的“状态”
怎么理解k呢
每一位i表示第i颗豆子有没有被围上
0表示没有,1表示围上了
假设有3颗豆子
000都没有
001一号围上了
011一二号围上了
100三号围上了
以此类推
然后就是判断有没有被围上的方法
这个东西属实不知道
是个叫做射线定理的东西
我们从豆豆开始向右引一条射线(其实向哪一个方向都可以),如果射线与路径的交点为奇数个,那么豆豆能被围住,反之则不能
如上
证明:
给每一条线规定内外
那么每穿过一次就反转了多边形的内外
若穿过奇数次,证明又回来了,所以在内部
反之在外部
代码参考网上
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int q[11][11][1050], f[11][11], x[11], y[11], v[11], ans;
int n, m, d, dx[4] = {1,-1,0,0}, dy[4] = {0,0,1,-1};
struct haha{
int a, b, c;
}dou;
int gc(int a,int b){
char t = ' ';
while(1){
scanf("%c",&t);
if (t == '#') return -1;
if (t >= '0' && t <= '9'){
x[t - '0'] = a;
y[t - '0'] = b;
return t - '0';
}
}
}
queue<haha>p;
int in[11][11][1050];
inline void doit(int stx, int sty){
memset(q, 0,sizeof(q ));
memset(in, 0, sizeof(in));
q[stx][sty][0] = 0;
p.push({stx, sty, 0});
int tx,ty,tz,tq,cross;
while (!p.empty()){
dou=p.front();p.pop();
for (int dir=0;dir<4;dir++){
tx=dou.a+dx[dir];ty=dou.b+dy[dir];
if (tx<=0||ty<=0||tx>n||ty>m||f[tx][ty]!=0) continue;
tz=dou.c;tq=q[dou.a][dou.b][dou.c]-1;
if (dir<2){
cross=min(tx,dou.a);
for (int i=1;i<=d;i++){
if (x[i]!=cross||y[i]>ty) continue;
if (tz&(1<<(i-1)))
tq-=v[i];
else
tq+=v[i];
tz=tz^(1<<(i-1));
}
}
if (!in[tx][ty][tz]){
q[tx][ty][tz]=tq;
p.push({tx,ty,tz});
in[tx][ty][tz]=1;
}
}
}
for (int i=0;i<(1<<d);i++)
if (in[stx][sty][i])
ans=max(ans,q[stx][sty][i]);
}
int main(){
scanf("%d%d",&n,&m);
scanf("%d",&d);
for (int i=1;i<=d;i++)
scanf("%d",&v[i]);
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
f[i][j]=gc(i,j);
}
}
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
if (f[i][j]==0)
doit(i,j);
printf("%d",ans);
}
SCOI 2009 围豆豆(状压DP)的更多相关文章
- SDOI 2009 学校食堂 状压dp
这个题的关键处1 紧跟着他的bi个人 —— 由此得出任意一个状态都可以表示为 有第一个人没吃到饭做分隔的前面所有人已吃饭,并用1<<8表示之后的(包括他)的八个人的状态2 信息仍然是上一个 ...
- Codevs 2009 大dota英雄 2013年省队选拔赛辽宁(状压DP)
2009 大dota英雄 2013年省队选拔赛辽宁 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 话说退役后的生活好无聊啊,以 ...
- 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 轮手帕上的序列 ...
- HDU3247 Resource Archiver —— AC自动机 + BFS最短路 + 状压DP
题目链接:https://vjudge.net/problem/HDU-3247 Resource Archiver Time Limit: 20000/10000 MS (Java/Others) ...
- NOJ 1116 哈罗哈的大披萨 【淡蓝】 [状压dp+各种优化]
我只能说,珍爱生命,远离卡常数的题...感谢陈老师和蔡神,没有他们,,,我调一个星期都弄不出来,,,, 哈罗哈的大披萨 [淡蓝] 时间限制(普通/Java) : 1000 MS/ 3000 MS ...
- 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表示,被淘汰 ...
随机推荐
- Oracle 11g RAC之HAIP相关问题总结
1 文档概要 2 禁用/启用HAIP 2.1 禁用/启用HAIP资源 2.2 修改ASM资源的依赖关系 3 修改cluster_interconnects参数 3.1 使用grid用户修改ASM实例的 ...
- 使用wrk进行http压力测试
Posted by 微博@Yangsc_o 原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0 最近做了一些服务器的工作,在做htt ...
- CentOS7——配置阿里云镜像源
CentOS7--配置阿里云镜像源 #下载CentOS 7的repo文件 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun ...
- 在CentOS7上源码安装OpenResty
您必须将这些库perl 5.6.1+libreadlinelibpcrelibssl安装在您的电脑之中. 对于 Linux来说, 您需要确认使用 ldconfig 命令,让其在您的系统环境路径中能找到 ...
- (一)DB、DBMS、SQL之间的关系
一.概念 DB:数据库(database)相当于一个仓库,用于有组织的采存储数据. DBMS:数据库管理系统(database manage system)数据库是通过DBMS来创建和操作,种类很多( ...
- 一文读懂Redis的四种模式,单机、主从、哨兵、集群
少点代码,多点头发 本文已经被GitHub收录,欢迎大家踊跃star 和 issues. https://github.com/midou-tech/articles 入职第一周,我被坑了 最近刚入职 ...
- 解决adb检测不到夜神模拟器
1.安装夜神模拟器 2.安装adb(安装教程——我的网盘(无邪appium环境安装.word)) 3.在D:\android-sdk_r24.4.1-windows\android-sdk-windo ...
- Jlink设置正确,但下载程序失败
[图中reset and run]勾选后即每次·下载程序后会自动复位,不需要再在硬件上进行复位 各参数设置正确 但依然下载失败. 原因是需要重新再编译一次,因为上次设置错误,编译后目标未创建! 重新编 ...
- python中的bytes和str类型
经过一上午的查找资料.大概理清楚了bytes类型和str类型的区别. bytes类型和str类型在呈现形式有相同之处,如果你print一个bytes类型的变量,会打印一个用b开头,用单引号括起来的序列 ...
- 什么了解suite集合实现
Testsuite继承BaseTestSuite其实内部的东西不是太多--生成suite集合的逻辑主要如下-我这里没有扒源码-因为他最终生成的TestsSuite关联的模块比较多--如果贴源码出来-- ...