NC23804. DongDong跳一跳
描述
DongDong有一只超可爱的英短喜欢跳一跳,但此跳一跳非彼跳一跳
有n根柱子,每根柱子都有一个高度和柱子上面鱼干的数量,英短开始的时候可以选择站在任意一根柱子上,每次跳跃不限长度而且只能从左向右跳跃,但只能跳到高度与当前所站高度差绝对值小于等于m的柱子上,英短可贪心了,想吃最多的鱼干,请你设计一个程序能让英短吃到最多的鱼干(最终不一定要落在第n根柱子上)。
输入描述
第一行给定两个整数,n,m
接下来n行,每行x,y表示这根柱子高度为x,上面有y根鱼干
数据范围:1<=n<=200000,1<=m<=500,对于每根柱子的x,y,1<=x<=1000000,1<=y<=1000000
输出描述
输出英短最多可以吃到多少鱼干
示例1
输入:
4 4 1 0 2 100 100 5 6 10
输出:
110
C++14(g++5.4) 解法, 执行用时: 222ms, 内存消耗: 3540K, 提交时间: 2019-06-10 14:39:32
#include <bits/stdc++.h> #define ll long long using namespace std; ll dp[1000505]; int main() { int n, m; ll ans=0; scanf("%d%d", &n, &m); for (int i=0;i<n;i++) { int h,v; scanf("%d%d",&h,&v); dp[h]+=v; ans=max(ans,dp[h]); for (int j=max(1,h-m);j<=h+m;j++) dp[j]=max(dp[j],dp[h]); } printf("%lld",ans); }
C++ 解法, 执行用时: 245ms, 内存消耗: 680K, 提交时间: 2022-02-28 21:01:19
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=1e6+10; ll dp[N]; int main() { int n,m,x,y; ll ans=0; cin>>n>>m; for(int i=0;i<n;i++) { cin>>x>>y; dp[x]+=y; ans=max(dp[x],ans); for(int j=max(1,x-m);j<=x+m;j++) { dp[j]=max(dp[j],dp[x]); } } cout<<ans<<endl; return 0; }