首页 > 其他分享 >Warp(DP)

Warp(DP)

时间:2022-09-05 00:23:37浏览次数:78  
标签:传送 int res ll Warp leq include DP

题意

有一个人站在二维平面的原点处。

他将会进行\(N\)次传送,每次传送他可以做如下三种移动中的一种:

  • 从当前位置\((X,Y)\)移动到\((X+A,Y+B)\)
  • 从当前位置\((X,Y)\)移动到\((X+C,Y+D)\)
  • 从当前位置\((X,Y)\)移动到\((X+E,Y+F)\)

有\(M\)个障碍物,分别位于\((X_1,Y_1),\dots, (X_M, Y_M)\),他不能传送到这些点上。

问经过\(N\)次传送,会产生多少条路径。

题目链接:https://atcoder.jp/contests/abc265/tasks/abc265_e

数据范围

\(1 \leq N \leq 300\)
\(0 \leq M \leq 10^5\)
\(-10^9 \leq A,B,C,D,E,F \leq 10^9\)

思路

这里提供两种思路。两种思路都是使用DP。

第一种思路,令\(f(n, x, y)\)表示\(n\)次传送,终点是\((x,y)\)的路径条数,转移方程显然。但是坐标范围太大,真的可以这样做吗?其实能到达的点的数量并不多。我们可以分析一下,三种传送方式的个数决定了终点,并且在给定总次数的情况下,固定前两种传送方式的个数,第三种传送方式的个数也固定了。因此,传送到的点数其实只有\(O(N^2)\)。在实际编写代码的过程中,不能直接使用数组进行转移,可以使用map来做。

第二种思路,令\(f(n,x,y)\)表示\(n\)次传送,其中第一种传送使用次数为\(x\),第二种传送使用次数为\(y\),可以产生多少条路径。转移方程显然。

代码

思路1

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <set>

using namespace std;

typedef long long ll;
typedef pair<ll, ll> pii;

const int N = 310, M = 100010, mod = 998244353;

int n, m;
ll dx[5], dy[5];
map<pii, ll> f;
set<pii> st;

int main()
{
    scanf("%d%d", &n, &m);
    for(int i = 0; i < 3; i ++) {
        scanf("%lld%lld", &dx[i], &dy[i]);
    }
    for(int i = 1; i <= m; i ++) {
        ll x, y;
        scanf("%lld%lld", &x, &y);
        st.insert({x, y});
    }
    f[{0, 0}] = 1;
    for(int i = 0; i < n; i ++) {
        map<pii, ll> g;
        for(auto p : f) {
            ll x = p.first.first, y = p.first.second, val = p.second;
            for(int j = 0; j < 3; j ++) {
                ll tx = x + dx[j], ty = y + dy[j];
                if(st.find({tx, ty}) != st.end()) continue;
                g[{tx, ty}] = (g[{tx, ty}] + val) % mod;
            }
        }
        swap(f, g);
    }
    ll res = 0;
    for(auto p : f) {
        res = (res + p.second) % mod;
    }
    printf("%lld\n", res);
    return 0;
}

思路2

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>

using namespace std;

typedef long long ll;
typedef pair<ll, ll> pii;

const int N = 310, M = 100010, mod = 998244353;

int n, m;
ll dx[5], dy[5];
ll f[N][N][N];
map<pii, bool> st;

int main()
{
    scanf("%d%d", &n, &m);
    for(int i = 0; i < 3; i ++) {
        scanf("%lld%lld", &dx[i], &dy[i]);
    }
    for(int i = 1; i <= m; i ++) {
        ll x, y;
        scanf("%lld%lld", &x, &y);
        st[{x, y}] = true;
    }
    f[0][0][0] = 1;
    for(ll i = 1; i <= n; i ++) {
        for(ll j = 0; j <= i; j ++) {
            for(ll k = 0; k <= i; k ++) {
                ll z = i - j - k;
                if(z < 0) continue;
                ll X = j * dx[0] + k * dx[1] + z * dx[2];
                ll Y = j * dy[0] + k * dy[1] + z * dy[2];
                if(st.count({X, Y})) {
                    f[i][j][k] = 0;
                    continue;
                }
                f[i][j][k] = (f[i - 1][j][k] + f[i - 1][j - 1][k]) % mod;
                f[i][j][k] = (f[i][j][k] + f[i - 1][j][k - 1]) % mod;
            }
        }
    }
    ll res = 0;
    for(int i = 0; i <= n; i ++) {
        for(int j = 0; j <= n; j ++) {
            if(i + j > n) continue;
            res = (res + f[n][i][j]) % mod;
        }
    }
    printf("%lld\n", res);
    return 0;
}

标签:传送,int,res,ll,Warp,leq,include,DP
From: https://www.cnblogs.com/miraclepbc/p/16656632.html

相关文章

  • 简单计数题(P1350车的放置 dp)
     题目传送门题目大意:给定一个图,在图中放置棋子,每行每列仅能放置一个,求放置\(k\)个的方案数。题目分析:对于给定图,若对于每个点都从前到后进行放置,难免会出现重复......
  • 【WPF】wpf怎么绑定多个值,多个控件 绑定多个CommandParameter 命令参数
    最近有不少wpf新手问wpf的命令怎么绑定多个控件,很多人为此绞尽脑汁,网上的答案找了也没找到靠谱的,其实用MultiBinding就可以了。从.net3.0版本开始,就支持MultiBinding关于......
  • 洛谷P1850 [NOIP2016 提高组] 换教室(期望dp)
    #include<bits/stdc++.h>usingnamespacestd;intn,m,v,e;intc[3005],d[3005];intf[305][305];doubledp[3005][3005][2];//dp[i][j][k]表示前i步申请更换了j......
  • dp----状态机模型
    《需求引出》《情况一:》在一般的dp问题中,我们的当前项都是可以由前一项推出的,但是在一些情况下我们要用到前前项的情况,这个时候可以将这个情况当做一个状态表示出来,进......
  • 简析XDP的重定向机制
    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。一.XDPSocket示例解析源码参见:https://......
  • 单调队列优化dp与斜率优化dp
    单调队列优化dp是个相对比较不显然的优化。例题:P2034选择数字题意:一串正整数,选择若干个数使和最大,且没有连续的超过k个数被选择。首先显然是个dp题。方程也比较显然。......
  • WordPress的网站链接,如何去掉index.php和category?
    使用WordPress搭建网站时,如果你是基于IIS服务器搭建的,肯定会遇到这个问题,就是固定链接设置好后,网址会出现烦人的index.php和category这两个关键字。  举个例子,博客的分......
  • 【luogu P5056】【模板】插头dp(插头DP)(分类讨论)
    【模板】插头dp题目链接:luoguP5056题目大意有一个n*m的网格,每个格子要么必须铺线,要么必须不铺。然后问你有多少个铺发使得形成一个闭合回路。思路快乐插头DP模......
  • 打开WordPress网站时,出现Http500错误怎么办?
    在用PHP+IIS+WordPress搭建博客系统时,我们最不想看到的就是报错,尤其是http500的错误,有时真是一头雾水,摸不到头脑。有时升级主题或插件,也会莫名其妙的报这个错误,对于没有编......
  • WordPress美女图集COS写真整站自适应网站源码带完整数据
    这是自己做的网站,因为自己要做别的业务,没有时间打理,而且放着也是放着,不如拿来分享给大家,这个资源非常火爆,用来引流还是很轻松的。 网站从服务器备份了下来,所以有完整......