BZOJ1126: [POI2008]Uci
$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的更多相关文章
- 1126: [POI2008]Uci
1126: [POI2008]Uci https://lydsy.com/JudgeOnline/problem.php?id=1126 分析: dp.状态很妙,就是有点难写. 能走的是一个矩形.首先 ...
- 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] ...
随机推荐
- 开始bootstrap的学习
终于过完双十一,服务器顶住了压力,不知道为啥,突然的轻松,反而感觉有点无所适从,好久没写博客了,竟然发现还有人回我,很是开心,问题都是关于阿里云的,阿里云的吭确实多,其实关键在于,官方文档还是少,出了 ...
- Java 11 正式发布,支持期限至2026年9月
美国当地时间9月25日,Oracle 官方宣布 Java 11 (18.9 LTS) 正式发布,可在生产环境中使用!这是自 Java 8 后的首个长期支持版本,非常值得大家的关注,可以通过下面的地址进 ...
- javajsp,Servlet:Property 'Id' not found
avax.el.PropertyNotFoundException: Property 'Id' not found on type org.androidpn.server.model.CarSo ...
- UVM基础之------uvm_transaction
uvm_transaction继承自uvm_object,添加了timing和recording接口,该类是uvm_sequence_item的基类.下边将做剖析 1. 这个类提供了时间戳属性(tim ...
- AI学习一:环境安装
对于Python开发用户来讲,PIP安装软件包是家常便饭.但国外的源下载速度实在太慢,浪费时间.而且经常出现下载后安装出错问题.所以把PIP安装源替换成国内镜像,可以大幅提升下载速度,还可以提高安装成 ...
- mysql use index() 优化查询
mysql use index() 优化查询 FORCE INDEX/IGNORE INDEX 的语法: SELECT *** FROM TABLE [{USE|IGNORE|FORCE} INDEX ...
- Android天天数钱游戏项目源码
Android天天数钱游戏源码,源码功能,天天数钱,这个游戏现在很多线上的小游戏都有这个了,游戏项目是在基于android游戏代码,大家可以参考一下. 源码下载:http://code.662p.co ...
- socket是什么?协议栈操作的抽象
http://www.cnblogs.com/airtcp/p/5230161.html TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口.就像操作系 ...
- ignore-on-commit svn 更改文件后 默认不提交文件到服务器(服务器上已存在的文件)
不用那个忽略文件那个,那个功能是删除服务器的文件,然后本地还存在,不符合我的要求 我的要求是 服务器文件在,我不动,然后我改完了,和别人的不冲突,我也不覆盖别人的文件 主要就是默认不提交,这个很重要 ...
- integer to roman leetcode c++实现
Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 t ...