题目链接:点击查看

题目大意:给出 n 个点 ( x[ i ] , y[ i ] ),如果第 t[ i ] 可以到达这个位置,贡献就可以加一,行走需要花费的时间等于两点之间的曼哈顿距离,问最大贡献是多少

题目分析:dp[ i ] 表示到点时的最大贡献,一个比较显然的转移方程是:O( n ) 枚举 j,满足 j < i,且满足两点的距离小于等于两点的间隔时间:dp[ i ] = max( dp[ j ] + 1 ),但问题是 n 比较大

通过观察不难发现 r 比较小,又因为题目中保证了 t[ i ] 是递增的,而在图中最远的两点的曼哈顿距离也不过 r + r - 2,所以所有小于 ( r + r - 2 ) 的 j 一定是可以到达 i 的,此时维护一个前缀最大值用来剪枝即可,总时间复杂度为 O( n * ( r + r - 2 ) )

代码:

//#pragma GCC optimize(2)
//#pragma GCC optimize("Ofast","inline","-ffast-math")
//#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e5+100;struct Node
{int x,y,t;
}p[N];int dp[N],mmax[N];int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);memset(dp,-inf,sizeof(dp));memset(mmax,-inf,sizeof(mmax));int r,n;scanf("%d%d",&r,&n);for(int i=1;i<=n;i++)scanf("%d%d%d",&p[i].t,&p[i].x,&p[i].y);p[0].x=p[0].y=1;p[0].t=0;mmax[0]=dp[0]=0;int ans=0;for(int i=1;i<=n;i++){if(i-1000>=0)dp[i]=max(dp[i],mmax[i-1000]+1);for(int j=max(0,i-1000);j<i;j++)if(abs(p[i].x-p[j].x)+abs(p[i].y-p[j].y)<=p[i].t-p[j].t)dp[i]=max(dp[i],dp[j]+1);mmax[i]=max(mmax[i-1],dp[i]);}printf("%d\n",mmax[n]);return 0;
}

CodeForces - 1427C The Hard Work of Paparazzi(dp+剪枝)相关推荐

  1. codeforces #274 C. Riding in a Lift dp+前缀和优化

    codeforces #274  C. Riding in a Lift   dp+前缀和优化 Imagine that you are in a building that has exactly  ...

  2. codeforces Round 21 808E. Selling Souvenirs 【dp好题】

    codeforces Round 21 808E. Selling Souvenirs [dp好题] E. Selling Souvenirs time limit per test 2 second ...

  3. Codeforces Gym101246C:Explode 'Em All(DP + bitset)

    http://codeforces.com/gym/101246/problem/C 题意:给出一个n*m的图,"*"表示这个地方需要炸掉,炸弹可以如果丢在(i,j)位置的话,那么 ...

  4. Codeforces Gym 100676G Training Camp 状压dp

    http://codeforces.com/gym/100676 题目大意是告诉你要修n门课,每门课有一个权值w[i], 在第k天修该课程讲获得k*w[i]的学习点数,给出了课程与先修课程的关系,要修 ...

  5. Educational Codeforces Round 8 D. Magic Numbers 数位DP

    D. Magic Numbers 题目连接: http://www.codeforces.com/contest/628/problem/D Description Consider the deci ...

  6. Codeforces 1205C Palindromic Paths (交互题、DP)

    题目链接 http://codeforces.com/contest/1205/problem/C 题解 菜鸡永远做着变巨的梦 然而依然连div1BC题都不会做 要是那天去打cf怕是又要1题滚粗了.. ...

  7. CodeForces - 1557D Ezzat and Grid(线段树+dp)

    题目链接:点击查看 题目大意:给出 nnn 个 010101 串,现在问最少需要删掉多少个串,才能使得剩下的串拼起来是连通的 规定两个 010101 串是连通的,当且仅当存在至少一列,在两个串中都为 ...

  8. CodeForces - 1498D Bananas in a Microwave(思维+dp)

    题目链接:点击查看 题目大意:给出 nnn 次操作,初始时有一个 k=0k=0k=0,每次操作抽象为三个数 txyt\ x\ yt x y,其中 xxx 可能为小数,可以选择一个 num∈[0,y]n ...

  9. CodeForces - 1354E Graph Coloring(dfs判断二分图+dp)

    题目链接:点击查看 题目大意:给出一个由 n 个点和 m 条边组成的无向图,要求给 n 个点赋值为 1 . 2 或 3 ,需要满足以下条件: 每个点都需要被赋值 权值为 1 的点共 n1 个 权值为 ...

最新文章

  1. MySQL 学习笔记(10)—— 联结表
  2. pandas使用str函数和startswith函数,筛选dataframe中不是(not start with)以特定前缀开头的数据列(selecting columns)
  3. iOS开发那些事-平铺导航-基于Page的导航及案例实现
  4. c语言二极管控制程序,二极管(STC89C52): 编写程序控制二极管花样流水灯
  5. ESP32启明云端又有新玩法|基于ESP32+热像仪传感的物联网非接触智能测温终端为高考护航了
  6. Springmvc中提交from之后不跳转不进控制器
  7. protel中PCB板大小的自定义方法
  8. python 获取硬盘信息_使用python获取电脑的磁盘信息方法
  9. PHP设计模式——观察者模式
  10. 流媒体技术学习笔记之(十六)H264编码profile level控制
  11. NFC匹配电路与滤波器设计
  12. 使用Vue开发Chrome插件
  13. 如何更改Win8,8.1中文版到英文版,亲测!
  14. AHA Music插件:超好用的听歌识曲搜索工具
  15. 局部全局变量、匿名函数、递行函数
  16. 无人出租赛道洗牌开启?这家公司为什么会黄?
  17. python3.9.0 安装教程
  18. python计算长方体体积最简单代码_C语言编程简单的小程序,计算长方体体积!...
  19. 软件测试:保障软件质量的关键性关口——记中国工商银行软件开发中心北京研发_manok_新浪博客...
  20. .Net core--- IOC

热门文章

  1. 台式电脑计算机硬盘清理,台式电脑重装系统win7清理磁盘碎片的方法
  2. 小说形象特征包括哪些方面_中高考常考题:怎样鉴赏散文中的形象 ?
  3. 服务器启动时的leader选举
  4. Condition.signal
  5. mybatis-逻辑翻页
  6. quartz工程容器启动与 Service注入
  7. Redis中的发布订阅模式
  8. 接口中私有方法【应用】
  9. React是什么及特点
  10. 数字型变量可以直接计算