LOJ 2550 「JSOI2018」机器人——找规律+DP
题目:https://loj.ac/problem/2550
只会写20分的搜索……
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
int n,m,ans;
bool b[N][N],vis[N][N];
void dfs(int x,int y,bool fx,int lj)
{
if(y>m)y=; if(x>n)x=;
if(vis[x][y])
{
if(x==&&y==)
{
bool fg=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(!vis[i][j]){fg=;break;}
if(!fg)ans+=lj;
}
return;
}
if(b[x][y])fx=; if(!fx)lj++;
vis[x][y]=;
dfs(x+,y,fx,lj); dfs(x,y+,fx,lj);
vis[x][y]=;
}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%1d",&b[i][j]);
ans=;
dfs(,,,);
printf("%d\n",ans);
}
return ;
}
观察多篇题解:
https://blog.csdn.net/qq_39972971/article/details/80441415
https://www.cnblogs.com/cjyyb/p/10422074.html
https://blog.csdn.net/scar_lyw/article/details/80411617
由结论可知合法的方案取决于左上角 d*d 怎么决策。(副对角线可以拐,所以是 d 条而不是 2*d-1 条)
枚举 d*d 里向下 i 步,向右 j=d-i 步,那么需要 i 和 n 互质、 j 和 m 互质。这样就是合法方案。考虑已知 i , j ,算贡献。
每个位置 ( x, y ) 都会在 “一轮”(d步) 之后走到 ( x+i , y+j ) 。
( 1, 1 ) 位置第一轮走到 ( i+1 , j+1 ) 。考虑 DP 这个第一轮的走法,就知道全局的走法了。
( 1, 1 ) 只能向下走或向右走。走过位置 ( x, y ) ,意味着会在之后的轮中把 ( x+k*i , y+k*j ) 都走过。
把 “走到第一个障碍为止的步数” 改成 “走到每个障碍为止的步数中的最小值” , 一个位置 ( x, y ) 的权值就是所有 ( x+k*i , y+k*j ) 的是障碍的点的 “走到该点的步数最小值” 取 min ;
就是要 DP 一条从 ( 1, 1 ) 到 ( i+1 , j+1 ) 的只能向下或向右走的路径,该路径贡献是路径上各点权值的最小值。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int Mn(int a,int b){return a<b?a:b;}
int gcd(int a,int b){return b?gcd(b,a%b):a;}
const int N=,M=N*N,mod=;
int upt(int x){while(x>=mod)x-=mod;while(x<)x+=mod;return x;} int n,m,lm,c[N][N],dp[N][N][M],ans;
bool b[N][N];
void cz(int &x,int y){x=upt(x+y);}
void solve(int x,int y)
{
memset(dp,,sizeof dp);
dp[][][c[][]]=;
for(int i=;i<=x+;i++)
for(int j=;j<=y+;j++)
for(int k=;k<=lm;k++)
{
int tp=dp[i][j][k]; if(!tp)continue;
if(i<=x)cz(dp[i+][j][Mn(k,c[i+][j])],tp);
if(j<=y)cz(dp[i][j+][Mn(k,c[i][j+])],tp);
}
for(int k=;k<=lm;k++)
ans=(ans+(ll)k*dp[x+][y+][k])%mod;
}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
ans=;
scanf("%d%d",&n,&m); lm=n*m;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%1d",&b[i][j]);
int g=gcd(n,m);
for(int x=;x<g;x++)
{
int y=g-x;
if(gcd(x,n)!=||gcd(y,m)!=)continue;
for(int i=;i<=x+;i++)
for(int j=;j<=y+;j++)
{
int d=i+j-;
if(b[i][j]){c[i][j]=d;continue;}
int tx=i+x, ty=j+y; d+=g;
if(tx>n)tx-=n; if(ty>m)ty-=m;
while()
{
if(b[tx][ty]||(tx==i&&ty==j))
{c[i][j]=d;break;}
tx+=x; ty+=y; d+=g;
if(tx>n)tx-=n;if(ty>m)ty-=m;
}
}
solve(x,y);
}
printf("%d\n",ans);
}
return ;
}
LOJ 2550 「JSOI2018」机器人——找规律+DP的更多相关文章
- 【LOJ】#2550. 「JSOI2018」机器人
题解 我不会打表找规律啊QAQ 规律就是 对于\(n = m\)我们每一条左下到右上的对角线上的点的走法都是一样的且每n步一个轮重复 对于\(n != m\)我们找到最大公约数\(d\),在每个\(d ...
- LOJ 2546 「JSOI2018」潜入行动——树形DP
题目:https://loj.ac/problem/2546 dp[ i ][ j ][ 0/1 ][ 0/1 ] 表示 i 子树,用 j 个点,是否用 i , i 是否被覆盖. 注意 s1<= ...
- LOJ 2548 「JSOI2018」绝地反击 ——二分图匹配+网络流手动退流
题目:https://loj.ac/problem/2548 如果知道正多边形的顶点,就是二分答案.二分图匹配.于是写了个暴力枚举多边形顶点的,还很愚蠢地把第一个顶点枚举到 2*pi ,其实只要 \( ...
- LOJ 2551 「JSOI2018」列队——主席树+二分
题目:https://loj.ac/problem/2551 答案是排序后依次走到 K ~ K+r-l . 想维护一个区间排序后的结果,使得可以在上面二分.求和:二分可以知道贡献是正还是负. 于是想用 ...
- LOJ 2547 「JSOI2018」防御网络——思路+环DP
题目:https://loj.ac/problem/2547 一条树边 cr->v 会被计算 ( n-siz[v] ) * siz[v] 次.一条环边会被计算几次呢?于是去写了斯坦纳树. #in ...
- @loj - 3157@「NOI2019」机器人
目录 @description@ @solution@ @accepted code@ @details@ @description@ 小 R 喜欢研究机器人. 最近,小 R 新研制出了两种机器人,分 ...
- 「JSOI2018」机器人
在本题当中为了方便,我们将坐标范围改至 \((0 \sim n - 1, 0 \sim m - 1)\),行走即可视作任意一维在模意义下 \(+1\). 同时,注意到一个位置只能经过一次,则可以令 \ ...
- LOJ 3092 「BJOI2019」排兵布阵 ——DP
题目:https://loj.ac/problem/3092 同一个人的不同城堡之间没有什么联系,只是和<=m.所以对每个城堡的 s 个值排序,做一个 f[ i ][ j ] 表示第 i 个城堡 ...
- Loj #3059. 「HNOI2019」序列
Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...
随机推荐
- Python 字符串String相关知识
test.capitalize( ) |首字母大写 test.lower( ) |全部变成小写(只能处理英文字母) test.casefold( ) | ...
- Problem A: 重载字符的加减法
Description 定义一个字符类Character,只有一个char类型的数据成员. 重载它的+.-.<<和>>运算符,其中+.-的第二个操作数是int类型的整数n.“+ ...
- better-scroll
better-scroll会将默认事件阻止掉,如果自己写的部分需要有点击事件,需要在参数里加上click:true. 同时,在PC上或某些手机端,由于未成功将touchend事件move掉,点击事件会 ...
- 安装Python mysqlclient出现“OSError: mysql_config not found”错误
问题: 使用Python3开发一个管理平台,用MySQL数据库存放元数据.使用pip安装mysqlclient模块时出现“OSError: mysql_config not ...
- Real time profiler for Delphi applications
xalion提供的资源,这么强,还是免费的,快去试用! ✓ Detailed debug information (internal, TDS, MAP) ✓ Display informat ...
- SMS PDU编码数据串格式分析
PDU协议数据单元详细介绍 PDU 相当于一个数据包,它由构成消息(SMS)的信息组成.作为一种数据单元,它必须包含源/目的地址.保护(有效)时间.数据格式.协议类型和正文,正文长度可达140字节,它 ...
- 关于SpringMVC的配置流程以及一些细节
首先说道SpringMvc是什么,SpringMVC是Spring框架里面的一个子框架,它对网站前后端的代码分层做了一套实现,这套实现给我们带来了几个好处,首先第一,SpringMVC实现了一个请求对 ...
- ELFHash算法解释
// ELF Hash Function unsigned int ELFHash(char *str) { unsigned int hash = 0; unsigned int x = 0; wh ...
- jQuery-4.动画篇---动画基础隐藏和显示
jQuery中隐藏元素的hide方法 让页面上的元素不可见,一般可以通过设置css的display为none属性.但是通过css直接修改是静态的布局,如果在代码执行的时候,一般是通过js控制元素的st ...
- mpvue开发小程序记录
1.同一组件内嵌套的 v-for 不能连续使用相同的索引,目前为: index,index <li v-for="(list, index) in datas" :key=& ...