1126: [POI2008]Uci
1126: [POI2008]Uci
https://lydsy.com/JudgeOnline/problem.php?id=1126
分析:
dp。状态很妙,就是有点难写。
能走的是一个矩形。首先考虑从x,y只能往左拐,到n,1的方案数。矩形是增加的。然后f[u][l][d][r][0/1/2/3]表示上边界u,左边界l,下边界d,右边界r的矩形,在左上角/右下角/左下角/左上角的方案数。
然后考虑这个从这个点可以沿着原来的方向走一步。或者拐弯(拐弯后直接到下一个角上,比如在右下角,拐弯后到右上角)。
初始值设为可以到x,y的,所有的点,尽管这些状态是不存在的。
空间开不下,把第一维滚动掉。
(开始想的的“推”的dp,这样的话初始值就比较方便了,但是就无法滚动第一维了)
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long LL; inline int read() {
int y=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())y=y*+ch-'';return y*f;
} const int N = ; int sr[N][N], sc[N][N], f[][N][N][N][];
char s[N];
int mod; inline void add(int &x,int y) {
x += y; if (x >= mod) x -= mod;
} int main() {
int n = read(), m = read();mod = read();int x = read(), y = read();
for (int i = ; i <= n; ++i) {
scanf("%s", s + );
for (int j = ; j <= m; ++j) {
sr[i][j] = sr[i][j - ] + (s[j] == '+');
sc[i][j] = sc[i - ][j] + (s[j] == '+');
}
}
int ans = ;
f[][x][y][x][] = ;
f[][x][y][x - ][] = ;
f[][x][y - ][x][] = ;
f[][x + ][y][x][] = ; for (int u = y, now = ; u >= ; --u, now ^= ) {
if (u != y) memset(f[now], , sizeof(f[now]));
for (int l = x; l >= ; --l)
for (int d = y; d <= n; ++d)
for (int r = x; r <= m; ++r) {
if (sc[d][r] - sc[u - ][r] == d - u + ) {
f[now][l][d][r][] = f[now][l][d][r - ][];
if (u < d) add(f[now][l][d][r][], f[!now][l][d][r][]);
}
if (sr[d][r] - sr[d][l - ] == r - l + ) {
f[now][l][d][r][] = f[now][l][d - ][r][];
if (l < r) add(f[now][l][d][r][], f[now][l][d][r - ][]);
}
if (sc[d][l] - sc[u - ][l] == d - u + ) {
f[now][l][d][r][] = f[now][l + ][d][r][];
if (u < d) add(f[now][l][d][r][], f[now][l][d - ][r][]);
}
if (sr[u][r] - sr[u][l - ] == r - l + ) {
f[now][l][d][r][] = f[!now][l][d][r][];
if (l < r) add(f[now][l][d][r][], f[now][l + ][d][r][]);
}
if (u == y && d == y && l == x && r == x) {
f[][x][y][x][] = ;
f[][x][y][x - ][] = ;
f[][x][y - ][x][] = ;
f[][x + ][y][x][] = ;
}
if (l == && d == n) add(ans, f[now][l][d][r][]);
}
}
cout << ans;
return ;
}
1126: [POI2008]Uci的更多相关文章
- BZOJ1126: [POI2008]Uci
$n \leq 100,m \leq 100$,$n*m$的01矩形,问从左下角开始往上走,每次转弯只能向右,不能经过重复点,不能撞到1,到达点$(x,y)$的方案数,$mod \ \ k$. 感人肺 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- [BZOJ1112][POI2008]砖块Klo
[BZOJ1112][POI2008]砖块Klo 试题描述 N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另 ...
- [bzoj1122][POI2008]账本BBB
1122: [POI2008]账本BBB Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 402 Solved: 202[Submit][Status ...
- BZOJ 1113: [Poi2008]海报PLA
1113: [Poi2008]海报PLA Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1025 Solved: 679[Submit][Statu ...
- BZOJ 1116: [POI2008]CLO
1116: [POI2008]CLO Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 922 Solved: 514[Submit][Status][ ...
- BZOJ 1112: [POI2008]砖块Klo
1112: [POI2008]砖块Klo Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1736 Solved: 606[Submit][Statu ...
- BZOJ 1124: [POI2008]枪战Maf
1124: [POI2008]枪战Maf Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 617 Solved: 236[Submit][Status ...
- BZOJ 1123: [POI2008]BLO
1123: [POI2008]BLO Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1030 Solved: 440[Submit][Status] ...
随机推荐
- 【3】【MOOC】Python游戏开发入门-北京理工大学【第三部分-游戏开发之机制(事件处理机制)】
学习地址链接:http://www.icourse163.org/course/0809BIT021E-1001873001?utm_campaign=share&utm_medium=and ...
- SOJ 1017 Power of Cryptography 库函数精度
Background Current work in cryptography involves (among other things) large prime numbers and comput ...
- 面向对象的JavaScript --- 封装
面向对象的JavaScript --- 封装 封装 封装的目的是将信息隐藏.一般而言,我们讨论的封装是封装数据和封装实现.真正的封装为更广义的封装,不仅包括封装数据和封装实现,还包括封装类型和封装变化 ...
- python中matplotlib总结
该总结只是为了记录自己学习过程中容易遗忘的问题,权当一个记事本使用. 1:散点图 plt.scatter()函数的原型 scatter(x, y, s=s, c=c, marker=marker, c ...
- 【问题解决】增加https后 phpcms 分页错误
https://m.cnbuses.com/m.cnbuses.com/index.php?page=2查看分页方法 function pages()中有个pageurl 查看该方法,发现有类似htt ...
- redis集群步骤(windows环境)
注:原文转自 https://blog.csdn.net/zsg88/article/details/73715947 ,仅用作为方便查阅 一 所需软件:Redis.Ruby语言运行环境.Redis的 ...
- 大数据学习--day17(Map--HashMap--TreeMap、红黑树)
Map--HashMap--TreeMap--红黑树 Map:三种遍历方式 HashMap:拉链法.用哈希函数计算出int值. 用桶的思想去存储元素.桶里的元素用链表串起来,之后长了的话转红黑树. T ...
- django的数据库操作-16
目录 增 1.save 2.create 查 1.基本查询 2.过滤查询 3. F对象 4. Q对象 5. 聚合函数 6. 排序 7. 关联查询 8. 关联+过滤查询 删 改 1. save 2. u ...
- Python学习:14.Python面向对象(一)
一.面向对象简介 Python设计之初,就是一门面向对象的语言,在Python中一切皆对象,而且在Python中创建一个对象也很简单,今天我们就来学习一下Python的面向对象的知识. 二.两种编程方 ...
- 中国大学MOOC-JAVA学习(浙大翁恺)—— 温度转换
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto- ...