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的更多相关文章

  1. BZOJ1126: [POI2008]Uci

    $n \leq 100,m \leq 100$,$n*m$的01矩形,问从左下角开始往上走,每次转弯只能向右,不能经过重复点,不能撞到1,到达点$(x,y)$的方案数,$mod \ \ k$. 感人肺 ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. [BZOJ1112][POI2008]砖块Klo

    [BZOJ1112][POI2008]砖块Klo 试题描述 N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另 ...

  4. [bzoj1122][POI2008]账本BBB

    1122: [POI2008]账本BBB Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 402  Solved: 202[Submit][Status ...

  5. BZOJ 1113: [Poi2008]海报PLA

    1113: [Poi2008]海报PLA Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1025  Solved: 679[Submit][Statu ...

  6. BZOJ 1116: [POI2008]CLO

    1116: [POI2008]CLO Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 922  Solved: 514[Submit][Status][ ...

  7. BZOJ 1112: [POI2008]砖块Klo

    1112: [POI2008]砖块Klo Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1736  Solved: 606[Submit][Statu ...

  8. BZOJ 1124: [POI2008]枪战Maf

    1124: [POI2008]枪战Maf Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 617  Solved: 236[Submit][Status ...

  9. BZOJ 1123: [POI2008]BLO

    1123: [POI2008]BLO Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1030  Solved: 440[Submit][Status] ...

随机推荐

  1. DTCoreText 、WKWebView 、UIWebView的比较

    DTCoreText .WKWebView .UIWebView的比较 HTML->View 数据解析: WebCore:排版引擎核心,WebCore包含主要以下模块:Loader, Parse ...

  2. 以太网,IP,TCP,UDP数据包分析

    http://www.cnblogs.com/feitian629/archive/2012/11/16/2774065.html 网络层的IP 协议是构成Internet 的基础.IP 协议不保证传 ...

  3. 24、springboot与缓存(2)

    具体看上文!!! @Service public class EmpService { @Autowired EmployeeMapper employeeMapper; @Cacheable(cac ...

  4. Kali-linux Gerix Wifi Cracker破解无线网络

    Gerix Wifi Cracker是另一个aircrack图形用户界面的无线网络破解工具.本节将介绍使用该工具破解无线网络及创建假的接入点. 9.3.1 Gerix破解WEP加密的无线网络 在前面介 ...

  5. 剑指offer 最小的k个数 、 leetcode 215. Kth Largest Element in an Array 、295. Find Median from Data Stream(剑指 数据流中位数)

    注意multiset的一个bug: multiset带一个参数的erase函数原型有两种.一是传递一个元素值,如上面例子代码中,这时候删除的是集合中所有值等于输入值的元素,并且返回删除的元素个数:另外 ...

  6. php版本跟扩展模块版本不兼容问题

    安装redis扩展后查看时候出现了这样报错: [root@localhost phpredis-develop]# php -m | grep redisPHP Warning: PHP Startu ...

  7. 404 Note Found 队-Alpha9

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...

  8. 软工之 NABCD 模型分析及 Web of Paper 原型设计结对作业

    目录 写在前面 NABCD 模型 N -- Need,需求 A -- Approach,方法 B -- Benefits,好处 C -- Compettors,竞争 优势 劣势 D -- Delive ...

  9. Failed to read artifact descriptor for org.apache.maven.plugins:maven-jar-plugin

    在更新maven项目的时候出现许多jar包找不到的问题,但是在本地仓库中查找的时候包含这些jar包. 解决办法: 把所有报错缺少的jar包所在的文件夹删掉,重新更新maven项目,重新下载完成后错误解 ...

  10. Python的迭代器与装饰器

    '''迭代器:两个基本方法:iter()和next()迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合等第一个元素开始访问,直到所有的元素被访问结束,迭代器只能往前不会后退. 迭代器有两个基本 ...