洛谷 P3800 Power收集
题目背景
据说在红雾异变时,博丽灵梦单身前往红魔馆,用十分强硬的手段将事件解决了。
然而当时灵梦在Power达到MAX之前,不具有“上线收点”的能力,所以她想要知道她能收集多少P点,然而这个问题她答不上来,于是她找到了学OI的你。
题目描述
可以把游戏界面理解成一个N行M列的棋盘,有K个格子上有P点,其价值为val(i,j)
初始灵梦可以选择在第一行的任意一个格子出发,每秒她必须下移一格。
灵梦具有一个左右移动的速度T,可以使她每秒向左或右移动至多T格,也可以不移动,并且不能折返。移动可视为瞬间完成,不经过路途上的点,只能获得目标格子的P点。
求最终她能获得的POWER值最大是多少?
输入输出格式
输入格式:
第一行四个数字,N,M,K,T
接下来K行每行3个数字x,y,v,代表第x行第y列有一个val为v的P点,数据保证一个格子上最多只有1个P点。
输出格式:
一个数字
输入输出样例
3 3 4 1
1 1 3
1 2 1
2 2 3
3 3 3
9
说明
对于40%的测试点,1<=N,M,T,K<=200
对于100%的测试点,1<=N,M,T,K<=4000
v<=100,N,M,K,T均为整数
by-szc
解题思路
DP,我想到的有以下两种思路
1、类似于这道题,可以从下到上一行行地填 f 数组,对于一行中的每一个,容易想到暴力搜索下一行从哪里转移过来,复杂度$O(nmt)$,然后就爆了。于是咋办呢?发现我们填$f[i][j]$时,搜了一遍$f[i+1][j-t]$到$f[i+1][j+t]$(不要在意边界溢出,特判一下就是了),然后填$f[i][j+1]$时,除了搜$f[i+1][j+t+1]$之外,又搜了一遍$f[i+1][j-t+1]$到$f[i+1][j+t]$,重复好多啊,于是怎么办呢?就想到了这题(https://www.luogu.org/problem/P2251),给一个序列,求所有一定长度的区间中的最值,嗯,RMQ,可以用st表,也可以用单调队列,这里套在每一行上,总复杂度就分别是$O(nmlog_2m)$(套st表)$O(nm)$(套单调队列),于是,st表有点虚啊,常数很大的同学可能就卡不过去了,而且st表空间$O(mlog_m)$,单调队列空间$O(t)$,还有……单调队列比st表好写太多了,果断单调队列,见下面第一个代码,最慢一个点862ms,怪不得出题人把时限开到2s,放了这个大众的思路
2、和打鼹鼠这题很像,可以看看我这篇博文。存下所有power的信息,然后按照行号、列号排个序,然后就类似最长不下降序列的DP做法了,每拓展一个位置,就向前扫描已经拓展的所有的位置,看看能从哪里来到这里,如果速度、时间都满足,就刷新最大值吧。见以下代码二。这个的时间复杂度$O(k^2)$,和上面那个单调队列是同阶的,但是这个思路实际用时是上面的二分之一,占用空间是上面的快十分之一,代码量是上面的二分之一,果然$\mbox{think twice, code once.}$啊。
2019年8月9日09:20:05更新:这就是传说中的单调队列优化DP么……上面链接挂了不少……第一个链接咋是回文平方数啊,我原本想挂那个题啊,是这个吗https://www.luogu.org/problem/P1508……洛谷这样子把题库改来改去不太好……以后挂链接还是挂我自己博客的吧
源代码
代码一(单调队列)
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; int n,m,k,t;
int a[][]={},f[][]={},q[]={}; void work(int i)
{
int l=,r=;
//memset(q,0,sizeof(q));
for(int j=;j<=m;j++)
{
while(l<r&&f[i+][q[r-]]<f[i+][j]) r--;
q[r++]=j;
while(l<r&&q[l]<j-t) l++;
f[i][j]=f[i+][q[l]];
}
l=,r=;
//memset(q,0,sizeof(q));
for(int j=m;j>=;j--)
{
while(l<r&&f[i+][q[r-]]<f[i+][j]) r--;
q[r++]=j;
while(l<r&&q[l]>j+t) l++;
f[i][j]=max(f[i][j],f[i+][q[l]]);
}
for(int j=;j<=m;j++)
f[i][j]+=a[i][j];
} int main()
{
scanf("%d%d%d%d",&n,&m,&k,&t);
for(int i=,u,v,w;i<=k;i++)
{
scanf("%d%d%d",&u,&v,&w);
a[u][v]=w;
}
for(int i=;i<=m;i++) f[n][i]=a[n][i];
for(int i=n-;i>;i--)
work(i);
int ans=-;
for(int j=;j<=m;j++)
ans=max(ans,f[][j]); printf("%d",ans);
return ;
}
代码二
#include<bits/stdc++.h>
using namespace std;
int n,m,k,t;
struct Edge{
int x,y,val;
}a[];
int cmp(Edge X,Edge Y)
{
return X.x<Y.x;
}
int f[]={};
int main(){
scanf("%d%d%d%d",&n,&m,&k,&t);
for (int i=;i<=k;i++) scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].val);
sort(a+,a++k,cmp);
int ans=;
for (int i=;i<=k;i++)
{
dp[i]=a[i].val;
for (int j=;j<i;j++)
if (abs(a[i].y-a[j].y)<=t*abs(a[i].x-a[j].x))
f[i]=max(f[i],f[j]+a[i].val);
ans=max(ans,f[i]);
}
printf("%d",ans);
return ;
}
哇,简直就是打鼹鼠的代码复制过来啊,那题不排序但这题排序是因为那题输入按时间顺序,这个没说按顺序
洛谷 P3800 Power收集的更多相关文章
- AC日记——Power收集 洛谷 P3800
Power收集 思路: 单调队列优化dp: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 4005 stru ...
- 洛谷p3800:Power收集
考虑朴素的dp: 对于每一行的每一个点 枚举能到的所有点(类似bzoj1648 比这题简单的dp) 期望时间复杂度O(NMT) 显然是超时做法 那么我们发现只有k个点对答案有贡献 考虑对每一个有权值的 ...
- luogu P3800 Power收集
题目背景 据说在红雾异变时,博丽灵梦单身前往红魔馆,用十分强硬的手段将事件解决了. 然而当时灵梦在Power达到MAX之前,不具有“上线收点”的能力,所以她想要知道她能收集多少P点,然而这个问题她答不 ...
- [洛谷P4918]信仰收集
题目背景 随着各种势力的迁入,守矢神社丧失了不少信仰现在,为了挽回香火日益惨淡的神社,八坂神奈子派遣神社的风祝早苗去人类村落收集信仰 题目描述 你可以将村落看成一个m个点的有向无环图(编号从1−m), ...
- P3800 Power收集
传送门 DP每次向下一格,显然是DP方程也十分显然:设$f[i][j]$为到第$i$行第$j$列时能得到的最大价值显然$f[i][j]=max(f[i-1][k]+v[i][j]),( max(0,j ...
- 洛谷 UVA10298 Power Strings 题解
Analysis 结论:设字符串长度为n,最长相同前后缀的长度为kmp[i],如n%(n-kmp[n])=0,则答案为n/(n-kmp[n]),否则为1. 如果循环节多于一个,以前n-kmp[n]个为 ...
- 洛谷P4550 【收集邮票】
题目链接: 神仙题QAQ 题目分析: 概率期望题是不可能会的,一辈子都不可能会的QAQ 这个题也太仙了 首先明确一下题意里面我感觉没太说清楚的地方,这里是抽到第\(i\)次要\(i\)元钱,不是抽到第 ...
- 【题解】洛谷P2914[USACO08OCT]断电Power Failure
洛谷P2914:https://www.luogu.org/problemnew/show/P2914 哇 这题目在暑假培训的时候考到 当时用Floyed会T掉 看楼下都是用Dijkstra 难道没有 ...
- 「洛谷3338」「ZJOI2014」力【FFT】
题目链接 [BZOJ] [洛谷] 题解 首先我们需要对这个式子进行化简,否则对着这么大一坨东西只能暴力... \[F_i=\sum_{j<i} \frac{q_iq_j}{(i-j)^2}-\s ...
随机推荐
- 机器学习概念之特征选择(Feature selection)之VectorSlicer算法介绍
不多说,直接上干货! VectorSlicer 算法介绍: VectorSlicer是一个转换器,输入特征向量,输出原始特征向量子集.VectorSlicer接收带有特定索引的向量列,通过对这些索引的 ...
- [转]ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL
本文转自:http://www.cnblogs.com/John-Connor/archive/2012/05/03/2478821.html 引言-- 在初级篇中,我们介绍了如何利用基于ASP.NE ...
- 动手实现 React-redux(一):初始化工程
可以看到 Redux 并不复杂,它那些看起来匪夷所思的设定其实都是为了解决特定的问题而存在的,我们把问题想清楚以后就不难理解它的那些奇怪的设定了.这节开始我们来看看如何把 Redux 和 React. ...
- android开发学习 ------- 枚举类型在Android中的用法
一般上为了简化代码,重用代码,设置标志位来表示不同的流程,这个标志位可以使用枚举类型来表示: 1:定义 public FbManner fbManer = FbManner.EMAIL; //给一个默 ...
- git分支提交管理
随着需求的增多,为了多人协作的顺利进行,需要进行分支开发,进而带来分支管理问题.今天主要讲一下如何管理分支及提交. 为了使git更好用,下面是我的git配置文件(放在C:\Users\Administ ...
- CF985E Pencils and Boxes
思路: 先对a数组排序,然后使用动态规划.dp[i]表示前i个能否正确划分.则如果存在dp[j] == 1, i - j + 1 >= k并且a[i] - a[j] < d,那么dp[i] ...
- CF962E Byteland, Berland and Disputed Cities
思路: http://codeforces.com/blog/entry/58869. 实现: #include <bits/stdc++.h> using namespace std; ...
- ThreadPoolExecutor 线程池
TestThreadPoolExecutorMain package core.test.threadpool; import java.util.concurrent.ArrayBlockingQu ...
- 【HEVC简介】SAO-Sample Adaptive Offset, 样本自适应偏移量
paper: Sample Adaptive Offset for HEVC <HEVC标准介绍.HEVC帧间预测论文笔记>系列博客,目录见:http://www.cnblogs.com/ ...
- 诊断Java代码中常见的数据库性能热点问题应该这么做!
“你的Java应用程序的性能是怎样诊断和优化的?不妨看看这两位西医的方子.如果你有更好疗效的药方,也欢迎在评论区告诉我们. 当我在帮助一些开发者或架构师分析及优化Java应用程序的性能时,关键往往不在 ...