题解 | #网格图#

网格图

https://ac.nowcoder.com/acm/problem/16735

【网格图.题解】

思路

对于图表类问题,给多少信息就直接放在 DP 维度中就好了,由于题目中新填了一个限制,所以对于当前的位置 来说,可能需要知道上一次转移的具体信息,所以在开一维度记录有那个方向的数转移而来

表示 到 且是由 的方向转移而来的方案数,那么答案就是

对于 我们有五中状态,分别对应 上下左右,以及停留。

转移过程,考虑转移到他的那个对象是否是在距离 中的,如果在范围内,那么他会有两种选择

  • 保持和当前的转移方向一致(题目给的
  • 变成停留状态

分别对应的状态为 f[i-1][rx][ry][d],f[i-1][rx][ry][4] 这里 表示停留的意思,这些变量都可以在代码中看到,所以方便理解。

对于对象不在范围内的,他可以有任意状态转移而来。

然后这个题目就这样做完了。

值得注意的是

看起来很简单,但是我做了很久,题解都看不懂,只好自力更生,我在一些地方被卡这里点出

  • 滚动数组优化
  • 多次取模可能会 T
  • 开long long + 多次取模会 T
  • 不开 long long,看你是否有 (s%mod+a%mod+mod)%mod 他会爆 ,like 1500000000+1e9 然后 boom!
#include <iostream>
#include <cstdio>
#include <algorithm>
#define ll long long
using namespace std;
const int B=200+10;
const int mod=1e9+7;
int read() {int x;scanf("%d",&x);return x;}
int n,m,t;
int f[2][B][B][5];
int res[B][B][5];
int dx[5]={-1,1,0,0,0};
int dy[5]={0,0,1,-1,0};
int x1,x2,y1,y2;
int D;
int main()
{
    n=read(),m=read(),t=read(),x1=read(),y1=read(),D=read(),x2=read(),y2=read();
    f[0][1][1][4]=1;
    int now=0;
    for (int i=1;i<=t;i++)
    {
        now^=1;
        for (int x=1;x<=n;x++)
        {
            for (int y=1;y<=m;y++)
            {
                for (int d=0;d<=4;d++)
                {
                    int rx=x+dx[d],ry=y+dy[d]; 
                    if (rx>n || rx<1 || ry>m || ry<1) continue;
                    int sum=0;
                    if (max(abs(x1-rx),abs(y1-ry))<=D)//在范围内 
                    {    
                        if (d==4)//他可以有任何转台转移 
                        {
                            for (int l=0;l<=4;l++)
                            {
                                sum=(1ll*sum+f[now^1][rx][ry][l])%mod;
                            }
                        }
                        else 
                        {
                            sum=(1ll*sum+f[now^1][rx][ry][d])%mod;
                            sum=(1ll*sum+f[now^1][rx][ry][4])%mod;
                        }
                    }
                    else 
                    {
                        for (int l=0;l<=4;l++)
                        {
                            sum=(1ll*sum+f[now^1][rx][ry][l])%mod;
                        } 
                    }
                    f[now][x][y][d]=sum%mod;
                }
            }
        }
    }
    int ans=0;
    for (int i=0;i<=4;i++)
    {
        ans=(1ll*ans+f[now][x2][y2][i])%mod;
    }
    cout<<ans<<endl;

}
/*
3 1 5 999 999 1 2 1 
*/
全部评论

相关推荐

头像
04-27 15:11
已编辑
华东师范大学 算法工程师
暑期实习从2月开始投,面了两个月,流程该挂的都挂完了,腾讯字节一共号称是1.7w个hc,不知道都发给谁了,估计今年秋招要难顶。Timeline米哈游、美团、蚂蚁、微软等公司直接简历挂穿,没进面。携程:3.3&nbsp;投递、测评3.12&nbsp;笔试3.18&nbsp;一面3.25&nbsp;二面4.13&nbsp;ai面(hr面)4.14&nbsp;英语测评4.23&nbsp;offer(已拒)腾讯:2.6&nbsp;测评2.28&nbsp;wxg一面3.5&nbsp;wxg二面(挂)3.11&nbsp;teg一面3.21&nbsp;teg二面(取消)3.31&nbsp;teg一面4.10&nbsp;teg二面(挂)4.21&nbsp;wxg一面4.24&nbsp;wxg二面(挂)字节:1.28&nbsp;aml约面(取消)3.17&nbsp;火山一面(挂)4.8&nbsp;aml一面(挂)4.20&nbsp;抖音data一面(挂)阿里:3.23&nbsp;投递、测评3.28&nbsp;笔试3.31&nbsp;淘天一面4.8&nbsp;钉钉一面4.9&nbsp;淘天二面4.10&nbsp;阿里控股一面4.12&nbsp;钉钉二面(取消)4.15&nbsp;淘天hr面4.16&nbsp;淘天offer(已接)4.21&nbsp;高德一面(取消)4.22&nbsp;淘宝闪购一面(取消)面试最大的感触是,现在撞上ai转型,一堆老业务急着转向,新业务非常不成熟,研究型的组bar非常高根本进不去,业务侧挂着算法的岗位干的都是工程活,面试却又要问算法,另外agent的落地也远没有那么广,绝大多数还是那套写死的系统调一下llm&nbsp;api或者做做rag,其余少部分真的在搭agent的,基本不能在线上服务用什么很智能的模型,现阶段成本太高,进去大概率就是给垃圾模型从工程方面兜底,除了业务场景的应用和数据经验以外,技术方面很难有什么提升。算法岗做不了基模的还是去搜广推好,之前判断失误了完全没投,秋招不知道还进不进得去。
绿糖滑稽:携程这什么雷霆流程时长
我的求职进度条
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务