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] ...
随机推荐
- mysql多表查询20题
+-------------------+| Tables_in_dapeng3 |+-------------------+| class || course || s1 || score || s ...
- Maximal Discount
Description: Linda is a shopaholic. Whenever there is a discount of the kind where you can buy three ...
- [转] Figuring out why my SVCHOST.EXE is at 100% CPU without complicated tools in Windows 7
(转自:Figuring out why my SVCHOST.EXE is at 100% CPU without complicated tools in Windows 7 - Scott Ha ...
- Jenkins邮件扩展插件Email Extension Plugin配置使用
1.在管理插件中搜索并安装邮件扩展插件Email Extension Plugin: 2.在任务中增加构建后操作步骤,选择Editable Email Notification; 3.在高级中Add ...
- [SQL]连续三天有销售额
店铺 销售日期 销售额 A 2017-10-11 300 A 2017-10-12 200 B 2017-10-11 400 B 2017-10-12 200 A 2017-10-13 100 A 2 ...
- 122. Best Time to Buy and Sell Stock II@python
Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...
- 洛谷 P3131 子共七
看到这一题第一印象就是暴力好打,$O(n^2)$,预计得分$70$分 这明显满足不了啊,我们要用到前缀和. $sum[i]$记录到i的前缀和,区间$[a,b]$的和就是$sum[b]-sum[a-1] ...
- MySQL丨03丨基本语句
MySQL语句都是以 ; 号结尾的 看库(刘大婶直接面对的是各种档案袋) show databases; 建库(新弄了一个档案袋) create database database_name; 删库( ...
- 如何用 CSS 创作一个立体滑动 toggle 交互控件
效果预览 在线演示 按下右侧的"点击预览"按钮在当前页面预览,点击链接全屏预览. https://codepen.io/zhang-ou/pen/zjoOgX 可交互视频教程 此视 ...
- timeslot概念(还是不太懂呀!!)
rules: 1. event.triggered只会保持一个time_slot,在下一个time_slot将会丢失这个标记,如果不能保证在每一个time_slot都会检测到这个标志,那么将会丢失这个 ...