热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

计蒜客T31434广场车神(二维前缀和优化dp)

题目链接Reference:https:www.cnblogs.comdiltheyp9757781.html首先容易想到的常规dp是,初始化dp(i,j)0dp(i,j)0dp(

题目链接



Reference:https://www.cnblogs.com/dilthey/p/9757781.html

首先容易想到的常规dp是,初始化dp(i,j)=0dp(i,j)=0,对于当前下标(i,j)(i,j)为右上角的一个边长为k+1k+1的正方形内:

dp(i,j)=∑x=i−ki∑y=j−kjdp(x,y)dp(i,j)= \sum_{x=i-k}^{i} \sum_{y=j-k}^{j}dp(x,y)

但是这样的时间复杂度为O(nwk2)O(nwk^2),使用二维前缀和优化

设最后dp方程的二维前缀和sum(i,j)=∑x=1i∑y=1jdp(x,y)sum(i,j)= \sum_{x=1}^{i} \sum_{y=1}^{j}dp(x,y),因为当前状态只能从一个(k+1)∗(k+1)(k+1)*(k+1)的正方形内的状态转移,如果使用二维前缀和计算这一方形区域,设下边界为d=i−k−1d=i-k-1,左边界为l=j−k−1l=j-k-1,状态转移方程为:

dp(i,j)=(sum(i−1,j)+sum(i,j−1)−sum(i−1,j−1))−(sum(d,j)+sum(i,l)−sum(d,l))dp(i,j)=(sum(i-1,j)+sum(i,j-1)−sum(i-1,j-1))−(sum(d,j)+sum(i,l)−sum(d,l)),画个图很容易看出来,然后根据二维前缀和的定义:

sum(i,j)=(sum(i−1,j)+sum(i,j−1)−sum(i−1,j−1))+dp(i,j)=2(sum(i−1,j)+sum((i,j−1)−sum(i−1,j−1))−(sum(d,j)+sum(i,l)−sum(d,l))sum(i,j)=(sum(i-1,j)+sum(i,j-1)−sum(i-1,j-1))+dp(i,j)=2(sum(i-1,j)+sum((i,j-1)−sum(i-1,j-1))−(sum(d,j)+sum(i,l)−sum(d,l))

那么最后的答案就是:

dp(n,m)=sum(n,m)−(sum(n−1,m)+sum(n,m−1)−sum(n−1,m−1))dp(n,m)=sum(n,m)−(sum(n-1,m)+sum(n,m-1)−sum(n-1,m-1))

#include <set>
#include <map>
#include <stack>
#include <queue>
#include <math.h>
#include <cstdio>
#include <string>
#include <bitset>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ins insert
#define Vector Point
#define lowbit(x) (x&(-x))
#define mkp(x,y) make_pair(x,y)
#define mem(a,x) memset(a,x,sizeof a);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<double,double> pdd;
const double eps=1e-8;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const double dinf=1e300;
const ll INF=1e18;
const int Mod=998244353;
const int maxn=2e5+10;
ll sum[2020][2020];
int main(){
freopen("racing.in","r",stdin);
freopen("racing.out","w",stdout);
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n,m,k;
cin>>n>>m>>k;
sum[1][1]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
if(i==1 && j==1) continue;
int l=max(0,i-k-1),d=max(0,j-k-1);
sum[i][j]=(2*(sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1])%Mod-(sum[l][j]+sum[i][d]-sum[l][d])%Mod+Mod)%Mod;
}
ll ans=(sum[n][m]-(sum[n-1][m]+sum[n][m-1]-sum[n-1][m-1])%Mod+Mod)%Mod;
cout<<ans<<endl;
return 0;
}

本文地址:https://blog.csdn.net/qq_44691917/article/details/107441455



推荐阅读
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • 796.[APIO2012]派遣在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿。在这个帮派里,有一名忍者被称之为Master。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • P2765魔术球问题这道题的思路实在是太罕见了,所以发一篇blog从某一新放入的球开始看起1.放入原来的柱子上2.放入新的柱子并将每个点进行拆点࿰ ... [详细]
  • 为什么python是动态类型语言_Python 3.7.0 面向对象的动态类型语言
    代表Python开发社区和Python3.7发布团队,我们很高兴地宣布https:www.python.orgdownloadsreleasepython-370 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
author-avatar
淑敏小朋友
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有