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. centos虚拟机安装,配置静态ip可以访问网络

    centos安装过程中需要注意几个问题 1.选择安装的软件 默认选择的是mininal,应该选择GNEME Desktop 安装的过程中可以设置network 配置linux网络命令 具体配置 退出键 ...

  2. [Noip2007]Core树网的核

    嘟嘟嘟 首先求树的直径两次bfs即可,实际上bfs就是最短路,因为树上路径是唯一的,所以用任何一种遍历方法都行(spfa和dijkstra当然也可以). 可以证明,只要求出任意一条直径就行了,为什么呢 ...

  3. consul搭建(初步)

    http://www.cnblogs.com/java-zhao/p/5375132.html https://blog.csdn.net/u010246789/article/details/517 ...

  4. HDU 1829 A Bug's Life (种类并查集)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1829 A Bug's Life Time Limit: 15000/5000 MS (Java/Oth ...

  5. gem install redis安装时报错:redis requires Ruby version >= 2.2.2

    Centos默认支持ruby到2.0.0,可gem 安装redis需要最低是2.2.2 解决办法是 先安装rvm,再把ruby版本提升至2.3.3 1.安装curl sudo yum install  ...

  6. activiti获取到流程图节点信息之任务节点

    //获取bpmnModel对象 BpmnModel model1 = new BpmnJsonConverter().convertToBpmnModel(modelNode); //由于我们这里仅仅 ...

  7. Linux -- 目录基本操作(1)

    cd 切换目录 1.切换到指定目录下 #cd 相对/绝对目录 [root@localhost ~]# cd /home/tom/demo [root@localhost demo]# 2.切换到某个用 ...

  8. 数据结构08——Trie

    一.什么是Trie? Trie树,一般被称为字典树.前缀树等等,Trie是一种多叉树,这个和二分搜索树.堆.线段树这些数据结构不一样,因为这些都是二叉树.,Trie树除了是一种多叉树,它是一种哈希树的 ...

  9. 一图看懂hadoop Yarn工作原理

    Hadoop 资源调度框架Yarn运行流程

  10. 两张图证明 WolframAlpha 的强大

    引用于:https://capbone.com/wolfram-alpha/ 两张图证明 WolframAlpha 的强大 之前在" 我手机中有哪些应用 "里提到过 Wolfram ...