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] ...
随机推荐
- iOS动画暂停和继续-本质是速度控制和时间坐标转换
时间永不停止! 写一个CALayer的分类,控制动画的暂停与继续 extension CALayer { ///暂停动画 func pauseAnimation() { //取出当前时间,转成动画暂停 ...
- 「BZOJ3226」[Sdoi2008]校门外的区间
题目 首先是开闭区间的处理,我们把\(1.5\)这种数加进来,用\([1.5,6]\)来表示\((2,6]\) 根据离散数学的基本知识,尝试把五个操作转化成人话 把\([x,y]\)变成\(1\) 把 ...
- bzoj4403:序列统计
我好傻啊 题目 先来看看长度只能为\(n\)的情况 那么答案非常显然是\(\binom{m+n-1}{n}\) 其中\(m=R-L+1\) 因为我们要构造一个非降序列,显然可能一个数会被选择多次,组合 ...
- Spring(二)之入门示例
任何编程技术,特别是入门示例,通常都是Hello World,在这里我也遵循这个业界公认的原则. 这里我使用的maven项目,大家如果想要演示,建议使用Eclipse(含maven插件)或Idea(含 ...
- 关于ie8下监听input事件的不兼容问题。
关于在ie8下,监听输入框的值变化的input事件不支持的解决办法: 很懒...直接上原文地址.... 原文地址:http://www.cnblogs.com/lhb25/archive/2012/1 ...
- IntelliJ IDEA隐藏不想看到的文件或文件夹
打开IntelliJ IDEA,File -> Settings -> Editor -> File Types 在红框部分加上你想过滤的文件或文件夹名
- MongoDB简易
一 安装 1.下载 $ brew install mongodb 2.启动 $ mongod --config /usr/local/etc/mongod.conf 3.连接 $ mongo 二 ...
- 解决apache启动错误:Could not reliably determine the server's fully qualified domain name
启动apache遇到错误:httpd: Could not reliably determine the server's fully qualified domain name [root@serv ...
- 【CSS-移动端响应式布局详解】
背景 移动端响应式布局开发主要方案有: 基于rem开发 基于媒体查询 基于弹性盒 基础概念 在讨论响应式布局知识前,先了解下移动端常用基础概念. 逻辑像素(CSS pixels) 浏览器使用的抽象单位 ...
- 对于PHP绘图技术的理解
要使用PHP绘图,就得在php.ini文件中设置一下 找到这个位置 ;extension=php_gd2.dll,然后把前面的分号去掉,重启下apache就可以了 几乎每行代码我都写了注释,方便看懂 ...