【SCOI2009】bzoj1294 围豆豆

2023-11-07 19:48
文章标签 scoi2009 豆豆 bzoj1294

本文主要是介绍【SCOI2009】bzoj1294 围豆豆,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这里写图片描述

暴力bfs显然不可行,需要判重。虽然状态有无穷多个,但是我们只关心哪些豆子被包围以及目前的步数。为了方便从每个豆子向上偏右引一条射线,记下多边形穿过射线次数的奇偶性,就可以表示豆子被包围的情况。
这样,记状态 (x,y,s) 表示当前在点 (x,y) ,被奇数次穿过的豆子为集合 s ,每走一步枚举豆子进行更新,复杂度O(m2n22dd)。好像可以预处理去掉一个 O(d)

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
char mp[15][15];
int last[12][12][600],px[10],py[10],v[10],
qx[2000010],qy[2000010],qs[2000010],qans[2000010],
xx[]={1,-1,0,0},yy[]={0,0,1,-1},
n,m,d,clo;
int ok(int x,int y)
{return x>=1&&x<=n&&y>=1&&y<=m&&mp[x][y]=='0';
}
int main()
{int hd,tl,x1,y1,s1,x,y,s,now,ans=0,tem;scanf("%d%d%d",&n,&m,&d);for (int i=0;i<d;i++) scanf("%d",&v[i]);for (int i=1;i<=n;i++){scanf("%s",mp[i]+1);for (int j=1;j<=m;j++)if (mp[i][j]>='1'&&mp[i][j]<='9'){px[mp[i][j]-'1']=i;py[mp[i][j]-'1']=j;}}for (int sx=1;sx<=n;sx++)for (int sy=1;sy<=m;sy++)if (ok(sx,sy)){last[sx][sy][0]=++clo;qx[1]=sx;qy[1]=sy;qs[1]=qans[1]=0;hd=tl=1;while (hd<=tl){x=qx[hd];y=qy[hd];s=qs[hd];now=qans[hd++];if (x==sx&&y==sy){tem=-now;for (int i=0;i<d;i++)if (s&(1<<i)) tem+=v[i];ans=max(ans,tem);}for (int k=0;k<4;k++)if (ok(x1=x+xx[k],y1=y+yy[k])){s1=s;for (int i=0;i<d;i++)   if (y<py[i]&&((x==px[i]&&k==0)||(x==px[i]+1&&k==1)))s1^=1<<i;if (last[x1][y1][s1]<clo){last[x1][y1][s1]=clo;tl++;qx[tl]=x1;qy[tl]=y1;qs[tl]=s1;qans[tl]=now+1;}}}}printf("%d\n",ans);
}

这篇关于【SCOI2009】bzoj1294 围豆豆的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/365888

相关文章

【BZOJ】1026: [SCOI2009]windy数 数位DP

传送门:【BZOJ】1026: [SCOI2009]windy数 题目分析:数位DP水题。 代码如下: #include <stdio.h>#include <cstring>#include <algorithm>#define rep( i , a , b ) for ( int i = a ; i < b ; ++ i )#define For( i ,

BZOJ 1293 [SCOI2009] 生日礼物 题解与分析

1293: [SCOI2009]生日礼物 Time Limit: 10 Sec   Memory Limit:162 MB Submit: 630   Solved: 326   Description 小西有一条很长的彩带,彩带上挂着各式各样的彩珠。已知彩珠有N个,分为K种。简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应的坐标(即位置)。某些坐标上可以没有彩

打豆豆game

好的,我将为您编写一个简单的“打豆豆”游戏。这个游戏的基本规则是这样的: 游戏将生成一个指定大小的网格,每个格子可能包含一个豆豆。玩家可以指定一个格子,如果该格子中有豆豆,则打掉该豆豆,并得分。每次打豆豆后,网格中的豆豆会随机分布。游戏持续进行,直到所有豆豆被打掉。 现在我将编写这个游戏的代码。请稍等片刻。 import random class BeanGame: def init(self,

1026: [SCOI2009]windy数(数位dp)

1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 12141 Solved: 5770 [Submit][Status][Discuss] Description   windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道, 在A和B之间,包括A和

P4159 [SCOI2009] 迷路(矩阵快速幂,两点路径为k的方案数)

思路: 具体参考https://www.luogu.com.cn/blog/qq-2056188203/mi-lu-scoi2009-ti-xie 简而言之,就是如果权值为1,要求两点之间经过 k k k条边的路径方案数,只要将邻接矩阵进行 k k k次方就好了。 本题权重为1~9,我们将每个点拆成10个点,两个点边权就通过拆成的点建边来表示,这样就成了权值为1的邻接矩阵形式了。 #inc

豆豆他爹:电影就是生活

豆豆他爹在电影就是生活中说:电影,就是我了解人生百态的窗口。电影,就是我不可或缺的一部分生活。 4年前,当我结束在北京的生活回到学校,同样把电影作为了解人生的手段,不过后来的日子全被我给荒废了,一年下来才看了A Beautiful Mind和减肥男女.。回到北京后,为了追LP,也着实看了一些(华星还是很贵啊)。现在为了节俭,尤其是LP考研这半年来,没有再去过华星了。天下无贼,功夫都是买的DVD

吃饭 睡觉 打豆豆!!!

* Copyright (c) 2012, 烟台大学计算机学院 * All rights reserved. * 作者:石晓涛 * 完成日期:2012 年11月15日 * 版本号:v1.0 * * 输入描述:使用switch语句 * 问题描述:死循环不死 * 程序输出:“吃饭睡觉打豆豆”   算法设计: #include<iostream>using namespace

【bzoj1025】【SCOI2009】【游戏】【dp】

Description windy学会了一种游戏。对于1到N这N个数字,都有唯一且不同的1到N的数字与之对应。最开始windy把数字按顺序1,2,3,……,N写一排在纸上。然后再在这一排下面写上它们对应的数字。然后又在新的一排下面写上它们对应的数字。如此反复,直到序列再次变为1,2,3,……,N。 如: 1 2 3 4 5 6 对应的关系为 1->2 2->3 3->1 4->5 5->4 6

【SCOI2009】windy数

Description windy定义了一种windy数。 不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,在A和B之间,包括A和B,总共有多少个windy数? Input 两个整数,A B。 Output 一个整数,表示A~B中有多少个windy数。 Sample Input 1 10 Sample Output 9 Data Constr

【SCOI2009】迷路

Description windy在有向图中迷路了。 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1。 现在给出该有向图,你能告诉windy总共有多少种不同的路径吗? 注意:windy不能在某个节点逗留,且通过某有向边的时间严格为给定的时间。 Input 第一行包含两个整数,N T。 接下来有 N 行,每行一个长度为 N 的字符串。 第i行第j列为