首页 > 其他分享 >POI2008UCI-The Great Escape

POI2008UCI-The Great Escape

时间:2024-04-15 19:47:44浏览次数:21  
标签:Great y2 rep POI2008UCI y1 Escape x2 x1 dp

dp #POI #Year2008

倒着跑这个过程,发现为每次拓宽一个矩形,记录这个矩形的对角的坐标,当前的方向,可以得到 \(dp_{x_1,y_1,x_2,y_2,4}\) ,从同方向相邻的点,或者转向后经过一条边长的点转移过来,单次转移是 \(\mathcal{O}(1)\) 的

但是这个会 \(MLE\) ,考虑一般的优化方法,即滚动

因为统计答案需要第 \(1,4\) 维,所以考虑对第 \(2\) 维滚动掉

然后分讨转移 这个分讨实在恶心

// Author: xiaruize
const int INF = 0x3f3f3f3f3f3f3f3f;
int MOD;
const int N = 2e5 + 10;

void add(int &x, int y)
{
	x += y;
	x = (x % MOD + MOD) % MOD;
	// if (x >= MOD)
	// 	x -= MOD;
}

int n, m, x, y;
int dp[105][2][105][105][4];
char s[105][105];
int col[105][105], rw[105][105];

void solve()
{
	cin >> n >> m >> MOD >> y >> x;
	rep(i, 1, n) cin >> (s[i] + 1);
	rep(i, 1, n)
	{
		rep(j, 1, m)
		{
			col[i][j] = col[i - 1][j] + (s[i][j] == '*');
			rw[i][j] = rw[i][j - 1] + (s[i][j] == '*');
		}
	}
	rep(i, 0, 3) dp[x][y & 1][x][y][i] = 1;
	per(y1, y, 1)
	{
		rep(x1, 1, n)
		{
			rep(x2, 1, n)
			{
				rep(y2, 1, m)
				{
					rep(i, 0, 3)
						dp[x1][(y1 & 1) ^ 1][x2][y2][i] = 0;
				}
			}
		}
		per(x1, x, 1)
		{
			rep(x2, x, n)
			{
				rep(y2, y, m)
				{
					if (x1 > 1 && s[x1 - 1][y2] == '+')
					{
						add(dp[x1 - 1][y1 & 1][x2][y2][2], dp[x1][y1 & 1][x2][y2][2]);
						if (rw[x1 - 1][y1 - 1] == rw[x1 - 1][y2])
							add(dp[x1 - 1][y1 & 1][x2][y2][3], dp[x1][y1 & 1][x2][y2][2]);
					}
					if (y1 > 1 && s[x1][y1 - 1] == '+')
					{
						add(dp[x1][(y1 & 1) ^ 1][x2][y2][3], dp[x1][y1 & 1][x2][y2][3]);
						if (col[x1 - 1][y1 - 1] == col[x2][y1 - 1])
							add(dp[x1][(y1 & 1) ^ 1][x2][y2][0], dp[x1][y1 & 1][x2][y2][3]);
					}
					if (x2 < n && s[x2 + 1][y1] == '+')
					{
						add(dp[x1][y1 & 1][x2 + 1][y2][0], dp[x1][y1 & 1][x2][y2][0]);
						if (rw[x2 + 1][y1 - 1] == rw[x2 + 1][y2])
							add(dp[x1][y1 & 1][x2 + 1][y2][1], dp[x1][y1 & 1][x2][y2][0]);
					}
					if (y2 < m && s[x2][y2 + 1] == '+')
					{
						add(dp[x1][y1 & 1][x2][y2 + 1][1], dp[x1][y1 & 1][x2][y2][1]);
						if (col[x1 - 1][y2 + 1] == col[x2][y2 + 1])
							add(dp[x1][y1 & 1][x2][y2 + 1][2], dp[x1][y1 & 1][x2][y2][1]);
					}
				}
			}
		}
	}
	// debug(dp);
	int res = 0;
	rep(i, 1, n)
	{
		rep(j, 1, m)
		{
			add(res, dp[i][1][n][j][0]);
		}
	}
	cout << res << endl;
}

#ifndef ONLINE_JUDGE
bool end_of_memory_use;
#endif

signed main()
{
	// freopen(".in","r",stdin);
	// freopen(".out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int testcase = 1;
	// cin >> testcase;
	while (testcase--)
		solve();
#ifndef ONLINE_JUDGE
	cerr << "Memory use:" << (&end_of_memory_use - &start_of_memory_use) / 1024.0 / 1024.0 << "MiB" << endl;
	cerr << "Time use:" << (double)clock() / CLOCKS_PER_SEC * 1000.0 << "ms" << endl;
#endif
	return 0;
}

标签:Great,y2,rep,POI2008UCI,y1,Escape,x2,x1,dp
From: https://www.cnblogs.com/xiaruize/p/18136782

相关文章

  • GreatSQL社区月报 | 2024.03
    GreatSQL成立于2021年,由万里数据库发起,是开放原子开源基金会旗下捐赠项目,及Gitee最有价值项目,拥有信通院可信开源社区+可信开源项目双认证。社区致力于通过开放的社区合作,构建自主开源数据库版本及开源数据库技术,推动开源数据库及应用生态繁荣发展。为了帮助社区的小伙伴们......
  • ANSI 转义序列(ANSI Escape Sequences)
    本文来自GithubGistfrom"fnky/ANSI.md"。下面是笔者翻译版本。持续更新中。ANSI转义序列标准Esc代码以Escape为前缀:Ctrl快捷键:^[八进制:\033Unicode:\u001b十六进制:\x1B十进制:27后面跟着命令,有时用左方括号([)分隔,称为控制序列引导码(CSI),后面可选地跟着......
  • GreatSQL 优化技巧:将 MINUS 改写为标量子查询
    GreatSQL优化技巧:将MINUS改写为标量子查询前言minus指令运用在两个SQL语句上,取两个语句查询结果集的差集。它先找出第一个SQL所产生的结果,然后看这些结果有没有在第二个SQL的结果中,如果在,那这些数据就被去除,不会在最后的结果中出现,第二个SQL结果集比第一个SQL结果......
  • a person who had great influence on me
    Sheisofmediumbuildandaboutmyheight.Whenyouseeherstraightblackhairandbigeyes,youwillthinkthatsheisaveryniceandsincereperson.Infact,that'sexactlywhosheis。Sheisintrovertedbutcute.Likefluffythings,likepink,k......
  • python中出现Microsoft Visual C++ 14.0 or greater is required
    我尝试下载了Microsoftvisualc++14.0,但是依然不管用,而且它是真的很大…… 直接安装相应依赖也不管用(可能其他人管用?)——condainstalllibpythonm2w64-toolchain-cmsys2链接:https://blog.csdn.net/qzzzxiaosheng/article/details/125119006 然后我有找到一个,看着描......
  • CF1945 H GCD is Greater
    CF1945HGCDisGreater什么鬼啊div3Hdiff:2775。纯属码力题。首先发现\(\gcd\)肯定数字越多越小。然后与值数字越多越小。所以结论就是选择两个数字取\(\gcd\),剩下的数字分到另一个集合。那么问题就变成了找出一对数字,它们的\(\gcd\)和剩下的数字的与做差值最大......
  • CodeForces 1945H GCD is Greater
    洛谷传送门CF传送门感觉是这场唯一比较有趣的题?首先明确一点:先手只会选\(2\)个数,因为数多了\(\gcd\)会变小,而且对方的\(\text{and}\)会变大。所以对于某一位,若\(0\)的个数\(\ge3\)那么对方的按位与这一位一定是\(0\)。所以若\(0\)的个数\(\le2\),那么可能会......
  • pytorch使用pytorch_wavelets包错误:ValueError: step must be greater than zero 错误
    错误描述在使用pytorch_wavelets包的DWT1DInverse时,发现报错信息如下:Traceback(mostrecentcalllast):File"/work/GDN/test/test_DWT.py",line24,inx_=idwt((YL,YH))File"/opt/conda/lib/python3.6/site-packages/torch/nn/modules/module.py",line550......
  • 从 VNCTF2024 的一道题学习QEMU Escape
    说在前面本文的草稿是边打边学边写出来的,文章思路会与一个“刚打完用户态pwn题就去打QEMUEscape”的人的思路相似,在分析结束以后我又在部分比较模糊的地方加入了一些补充,因此阅读起来可能会相对轻松。(当然也不排除这是我自以为是)题目github仓库[1]题目分析流程[1-1]......
  • 编译GreatSQL with RocksDB引擎
    GreatSQL里也能用上RocksDB引擎1.前言RocksDB是基于Facebook开源的一种支持事务的、高度可压缩、高性能的MyRocks存储引擎,特别适用于高度压缩和大容量的数据。以下是一些关键特点:高性能:LSM树结构使得RocksDB在写入密集型负载下表现卓越。它能够处理大量的写入操作,并且......