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

感人肺腑的细节题写了一天。。

可以发现他在做一个绕圈运动,运动的过程中逐渐限制自己的活动范围,因此可以用活动范围和射入方向表示状态(这样也就确定了它的位置),$f[L][R][U][D][0123]$--沿左边向上、沿上边向右、沿右边向下、沿下边向左射入矩形$[L,R,U,D]$的方案。如图:

这样转移可以用一个前缀和转移。比如上转右的:

用纵方向一个前缀的蓝色矩形转移到右方向的一个矩形。这样就可以$O(1)$转移了。

由于四维开不下,要把L那一维滚动掉,所以记前缀和的时候,左转上那个数组不要清,那里实际保留了所有$L_2<L$转移到$L$的状态的前缀和。

记答案的时候,在目标处转弯时记录答案。注意最后一圈不要记重了。这句话是啥意思我也说不清,看代码吧QAQ

 //#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
//#include<time.h>
//#include<complex>
#include<algorithm>
#include<stdlib.h>
using namespace std; int n,m,mod,tx,ty;
#define maxn 111
int f[][maxn][maxn][maxn][],cur,sum[maxn][maxn][maxn][],bl[maxn][maxn][]; char s[maxn];
bool mp[maxn][maxn]; //0 up 1 right 2 down 3 left
int main()
{
scanf("%d%d%d%d%d",&n,&m,&mod,&ty,&tx);
for (int i=;i<=n;i++)
{
scanf("%s",s+);
for (int j=;j<=m;j++) mp[i][j]=(s[j]=='+');
} for (int j=;j<=m;j++)
{
bl[][j][]=;
for (int i=;i<=n;i++) if (mp[i][j]) bl[i][j][]=bl[i-][j][];
else bl[i][j][]=i;
}
for (int i=;i<=n;i++)
{
bl[i][m+][]=m+;
for (int j=m;j;j--) if (mp[i][j]) bl[i][j][]=bl[i][j+][];
else bl[i][j][]=j;
}
for (int j=;j<=m;j++)
{
bl[n+][j][]=n+;
for (int i=n;i;i--) if (mp[i][j]) bl[i][j][]=bl[i+][j][];
else bl[i][j][]=i;
}
for (int i=;i<=n;i++)
{
bl[i][][]=;
for (int j=;j<=m;j++) if (mp[i][j]) bl[i][j][]=bl[i][j-][];
else bl[i][j][]=j;
}
cur=; for (int i=;i<=n;i++) sum[m][i][n][]=; int ans=;
for (int L=;L<=ty+;L++)
{
cur^=;
for (int R=m;R>=ty;R--) for (int U=;U<=tx;U++) for (int D=max(U,tx);D<=n;D++)
{
sum[R][U][D][]=sum[R+][U][D][];
f[cur][R][U][D][]=;
if (bl[D][L-][]<U)
{
f[cur][R][U][D][]=sum[R][U][D][];
sum[R][U][D][]+=f[cur][R][U][D][]; sum[R][U][D][]-=sum[R][U][D][]>=mod?mod:;
}
if (L-==ty && U==tx) ans+=f[cur][R][U][D][],ans-=ans>=mod?mod:;
}
if (L==ty+) break;
for (int D=n;D>=tx;D--) for (int R=ty;R<=m;R++) for (int U=;U<=tx+;U++)
{
sum[R][U][D][]=sum[R][U][D+][];
f[cur][R][U][D][]=;
if (bl[U-][L-][]>R)
{
f[cur][R][U][D][]=sum[R][U-][D][];
sum[R][U][D][]+=f[cur][R][U][D][]; sum[R][U][D][]-=sum[R][U][D][]>=mod?mod:;
}
if (U-==tx && R==ty) ans+=f[cur][R][U][D][],ans-=ans>=mod?mod:;
}
for (int D=n;D>=tx;D--) for (int R=ty;R<=m;R++) sum[R][][D][]=sum[R][][D+][];
for (int U=;U<=tx;U++) for (int D=max(tx,U);D<=n;D++) for (int R=ty-;R<m;R++)
{
f[cur][R][U][D][]=;
if (bl[U][R+][]>D)
{
f[cur][R][U][D][]=sum[R+][U][D][];
sum[R][U][D][]+=f[cur][R][U][D][]; sum[R][U][D][]-=sum[R][U][D][]>=mod?mod:;
}
if (D==tx && R+==ty) ans+=f[cur][R][U][D][],ans-=ans>=mod?mod:;
}
for (int U=;U<=tx;U++) for (int D=tx-;D<=n;D++) for (int R=ty;R<=m;R++)
{
if (U) sum[R][U][D][]=sum[R][U-][D][];
f[cur][R][U][D][]=;
if (bl[D+][R][]<L)
{
f[cur][R][U][D][]=sum[R][U][D+][];
sum[R][U][D][]+=f[cur][R][U][D][]; sum[R][U][D][]-=sum[R][U][D][]>=mod?mod:;
}
if (D+==tx && L==ty) ans+=f[cur][R][U][D][],ans-=ans>=mod?mod:;
}
for (int U=;U<=tx;U++) for (int R=ty;R<=m;R++) sum[R][U][n][]=sum[R][U-][n][];
}
printf("%d\n",ans);
return ;
}

BZOJ1126: [POI2008]Uci的更多相关文章

  1. 1126: [POI2008]Uci

    1126: [POI2008]Uci https://lydsy.com/JudgeOnline/problem.php?id=1126 分析: dp.状态很妙,就是有点难写. 能走的是一个矩形.首先 ...

  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. PHP设计模式 原型模式(Prototype)

    定义 和工厂模式类似,用来创建对象.但实现机制不同,原型模式是先创建一个对象,采用clone的方式进行新对象的创建. 场景 大对象的创建. 优点 1.可以在运行时刻增加和删除产品 2.可以改变值或结构 ...

  2. HTTP协议 处理流程

    我们平时在浏览网页的时候都是使用浏览器,输入你要的网址后回车,就会显示出我们所想要的内容,看似这个简单的用户操作行为的背后,Web的工作原理是怎样的呢?到底隐藏了些什么呢? 对于传统的上网流程,系统它 ...

  3. (转)新手学习System Verilog & UVM指南

    从刚接触System Verilog以及后来的VMM,OVM,UVM已经有很多年了,随着电子工业的逐步发展,国内对验证人才的需求也会急剧增加,这从各大招聘网站贴出的职位上也可以看出来,不少朋友可能想尽 ...

  4. java中同步(synchronized)详解

    一.开山篇: 1.synchronized的使用 一个程序中,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题.在Java中内置了语言级的同步原语--synchronized,这也大大简 ...

  5. Java遍历HashMap并修改(remove)

    遍历HashMap的方法有多种,比如通过获取map的keySet, entrySet, iterator之后,都可以实现遍历,然而如果在遍历过程中对map进行读取之外的操作则需要注意使用的遍历方式和操 ...

  6. Elasticsearch搜索含有数字标签的处理

    {"tag_id":“12345”} 在search的时候是完全匹配,因为Elasticsearch在处理这个的过程中把“123456”字符当成一个整体的数据,因此折腾了好久就是找 ...

  7. TCP/IP详解之IP协议

    1.IP协议 IP协议是TCP/IP协议的核心,所有的TCP,UDP,IMCP,IGCP的数据都以IP数据格式传输.要注意的是,IP不是可靠的协议,这是说,IP协议没有提供一种数据未传达以后的处理机制 ...

  8. 回顾Spring MVC_01_概述_入门案例

    SpringMVC: SpringMVC是Spring为展现层提供的基于MVC设计的优秀的Web框架,是目前最主流的MVC框架之一 SpringMVC通过注解,让POJO成为处理请求的控制器,而无须实 ...

  9. cocos creator 小记

    一个游戏场景有若干个节点组成,这些包括渲染节点,UI节点.   这里弱化了Layer层的概念. 一个游戏由若干个场景组件. 每个节点由若干个组件和若干子节点组成. 例如UI节点中的 按钮节点.子节点有 ...

  10. clone对象或数组

    function clone(obj) { var o; if (typeof obj == "object") { if (obj === null) { o = null; } ...