日常吐槽

作为hin久hin久以前考试考到过的一道题窝一直咕咕咕到现在才想起来去做因为讲解都忘干净了然后自己重新考虑发现被卡了3天

题面





看到题目发现这题的dp状态似乎有点不是很明确?

我们来理一理题目的限制以及我们要干什么。

每条路上出现的金币数量受时间和地点的限制。所以我们至少要用到一个二维的东西。

题目中说当机器人消失的时候需要在任意一个工厂购买机器人。我们先以可能TLE的思路进行dp。设\(dp[i][j]\)表示在\(i\)时刻到达工厂\(j\)的最大值。我们要枚举从哪个点走到了\(j\)点,同时因为购买地点的选取是任意的,所以要加上\(max\{ f[i-k][j]\),那么\(dp[i][j]=max\{max\{ f[i-k][j] \},gold(d,j,i-k,i)-cst[d]\}\),其中\(gold(d,j,i-k,i)\)表示在\(i-k\)时刻一直到\(i\)时刻,从\(d\)点走到\(j\)点路上的所有金币。但这个肯定是会\(T\)的,我们发现地点这一维是最耗复杂度的(它整整占用了两层\(for\)),于是果断删掉。

于是我们设\(dp[i]\)表示\(i\)时刻的最大收益,但是去掉地点这一维了,上面的\(gold\)就必须预处理。

设\(sum[i][j]\)表示在时刻\(i\),从0时刻的第1个工厂走到了第\(j\)个工厂的能捡到的金币,即不扣除买机器人的钱(在哪里买机器人是\(dp\)中要干的事,这里只是预处理)。在这里设\(money[i][j]\)表示时刻\(j\),第\(i\)条路上出现的金币数量。那么\(sum[i][j]=sum[i-1][jian(j,1)]+money[jian(j,1)][i]\)。其中\(jian(i,j)\)表示\(j\)工厂往前走\(i\)步到达的工厂。

辣么转移方程也就呼之欲出了。\(dp[i]=max\{ dp[i-j]+sum[i][k]-sum[i-j][jian(k,j)]-cst[jian(k,j)]\}\),\(cst[i]\)表示在第\(i\)个工厂购买机器人花的钱。

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<ctime>
#include<cstdlib>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef __int128 i128;
const int inf=2147483647;
inline int read()
{
char ch=getchar();
int x=0;
bool f=0;
while(ch<'0'||ch>'9')
{
if(ch=='-') f=1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
return f?-x:x;
}
int n,m,p,mon[1009][1009],cst[1009];
int dp[1009],sum[1009][1009];
inline int jian(int i,int k)
{
int qwq=(i-k+n)%n;
return qwq?qwq:n;
}
int main()
{
freopen("1.in","r",stdin);
n=read();m=read();p=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
mon[i][j]=read();//money在这里简写为mon
for(int i=1;i<=n;i++)
cst[i]=read();
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
sum[i][j]=sum[i-1][jian(j,1)]+mon[jian(j,1)][i];//,printf("sum[%d][%d]=%d\n",i,j,sum[i][j]);
memset(dp,-0x3f,sizeof(dp));
dp[0]=0;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=p;j++)//枚举步数
{
for(int k=1;k<=n;k++)//枚举地点
if(i-j>=0)
dp[i]=max(dp[i],dp[i-j]+sum[i][k]-sum[i-j][jian(k,j)]-cst[jian(k,j)]);
}
}
printf("%d",dp[m]);
}

我们发现上面的方程需要枚举地点,它是个三维的,会\(TLE\)(当然因为现在机子跑的快是可以卡过的),我们要想办法优化。

时间肯定是不能省略的,那剩下的就是步数和地点。我们肯定要把一维优化掉。思考哪个看起来更好搞一些。地图是个环,看起来很麻烦的亚子,所以我们把步数优化掉。

把方程中不需要枚举步数的项提出来:

\(dp[i]=max\{dp[i-j]-sum[i-j][jian(k,j)]-cst[jian(k,j)]\}+sum[i][k]\)

由于步数是要被优化掉的,所以我们保留时间和地点两个状态,设置辅助变量\(qwq[i][j]=dp[i]-sum[i][j]-cst[j]\)

新的方程:\(dp[i]=max\{qwq[i-k][j-k]\}+sum[i][j]\),其中k枚举步数,我们要优化掉这一维,发现第二维每次枚举的时候会+1,于是可以各种乱搞

由于博主用不优化的代码卡过了所以优化代码先咕咕咕叭

(逃)(害怕被打.jpg) 跟我读:可持久化咕咕咕

P1070道路游戏题解的更多相关文章

  1. 洛谷 P1070 道路游戏 解题报告

    P1070 道路游戏 题目描述 小新正在玩一个简单的电脑游戏. 游戏中有一条环形马路,马路上有\(n\)个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针顺序依 ...

  2. 洛谷P1070 道路游戏

    P1070 道路游戏 题目描述 小新正在玩一个简单的电脑游戏. 游戏中有一条环形马路,马路上有 n 个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针顺序依次将 ...

  3. 洛谷 P1070 道路游戏 DP

    P1070 道路游戏 题意: 有一个环,环上有n个工厂,每个工厂可以生产价格为x的零钱收割机器人,每个机器人在购买后可以沿着环最多走p条边,一秒走一条,每条边不同时间上出现的金币是不同的,问如何安排购 ...

  4. [luogu]P1070 道路游戏[DP]

    [luogu]P1070 道路游戏 题目描述小新正在玩一个简单的电脑游戏.游戏中有一条环形马路,马路上有 n 个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针 ...

  5. 【题解】洛谷P1070 道路游戏(线性DP)

    次元传送门:洛谷P1070 思路 一开始以为要用什么玄学优化 没想到O3就可以过了 我们只需要设f[i]为到时间i时的最多金币 需要倒着推回去 即当前值可以从某个点来 那么状态转移方程为: f[i]= ...

  6. 洛谷P1070 道路游戏(dp+优先队列优化)

    题目链接:传送门 题目大意: 有N条相连的环形道路.在1-M的时间内每条路上都会出现不同数量的金币(j时刻i工厂出现的金币数量为val[i][j]).每条路的起点处都有一个工厂,总共N个. 可以从任意 ...

  7. P1070 道路游戏

    题目描述 小新正在玩一个简单的电脑游戏. 游戏中有一条环形马路,马路上有 n 个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针顺序依次将这 n 个机器人工厂编 ...

  8. 洛谷 P1070 道路游戏(noip 2009 普及组 第四题)

    题目描述 小新正在玩一个简单的电脑游戏. 游戏中有一条环形马路,马路上有 nn个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针顺序依次将这 nn个机器人工厂编 ...

  9. luogu P1070 道路游戏

    传送门 这里设\(f_i\)表示时刻\(i\)的答案 转移的话在\([i-p+1,i-1]\)之间枚举j,然后考虑从哪个点走过来 复杂度为\(O(n^3)\) // luogu-judger-enab ...

随机推荐

  1. Docker容器入门之一:部署SpringBoot项目

    一.环境准备:    1.vm虚拟机: Workstation 12 Pro 12.5.7 build-5813279 2.Centos 7 在虚拟机上安装好Centos7系统后,就可以开始准备安装D ...

  2. 使用Django的ORM详细操作

    1.自己动手创建数据库 create database 数据库名; 2.在Django项目中设置连接数据库的相关配置(告诉Django连接哪一个数据库) #在数据库相关的配置 DATABASES = ...

  3. 从Spring看Web项目开发

    之前简单介绍过Spring框架,本文换个角度重新诠释Spring.使用Java语言开发的项目,几乎都绕不过Spring,那么Spring到底是啥,为何被如此广泛的应用,下面从以下两个问题出发来剖析Sp ...

  4. iperf和iperf3详解

    一.iperf server端: iperf -s -p 25001 -B 192.168.33.103 (-u) -s  指定server端 -p 指定端口(要和客户端一致) -B 绑定ip地址 - ...

  5. VMware三种网络模式详解

    转载自https://www.cnblogs.com/linjiaxin/p/6476480.html 好文章怕原始地址会不能用,转载到自己这里,感谢原作者的无私奉献. 由于Linux目前很热门,越来 ...

  6. 阿里云(ecs服务器)使用1-设置安全组

    1.进入阿里云的控制台https://ecs.console.aliyun.com/?#/server/region/cn-qingdao,点击管理 2.点击左边的 本实例安全组 3. 点击加入配置规 ...

  7. JavaScript中数组元素删除的七大方法汇总

    原文链接:https://blog.csdn.net/u010323023/article/details/52700770 在JavaScript中,除了Object之外,Array类型恐怕就是最常 ...

  8. 使用IDEA搭建一个 Spring + Spring MVC + Mybatis 的Web项目 ( 零配置文件 )

    前言: 除了mybatis 不是零配置,有些还是有xml的配置文件在里面的. 注解是Spring的一个构建的一个重要手段,减少写配置文件,下面解释一下一些要用到的注解: @Configuration  ...

  9. qt5-自定义类

    创建一个自定义按钮类: 右击工程目录--->--->--->---> ---> --->

  10. css 设置头像图片不变形

    css 设置头像图片不变形 在样式中加 object-fit: cover 就可以了