CodeForces - 1427C The Hard Work of Paparazzi(dp+剪枝)
题目链接:点击查看
题目大意:给出 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+剪枝)相关推荐
- 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 ...
- codeforces Round 21 808E. Selling Souvenirs 【dp好题】
codeforces Round 21 808E. Selling Souvenirs [dp好题] E. Selling Souvenirs time limit per test 2 second ...
- Codeforces Gym101246C:Explode 'Em All(DP + bitset)
http://codeforces.com/gym/101246/problem/C 题意:给出一个n*m的图,"*"表示这个地方需要炸掉,炸弹可以如果丢在(i,j)位置的话,那么 ...
- Codeforces Gym 100676G Training Camp 状压dp
http://codeforces.com/gym/100676 题目大意是告诉你要修n门课,每门课有一个权值w[i], 在第k天修该课程讲获得k*w[i]的学习点数,给出了课程与先修课程的关系,要修 ...
- Educational Codeforces Round 8 D. Magic Numbers 数位DP
D. Magic Numbers 题目连接: http://www.codeforces.com/contest/628/problem/D Description Consider the deci ...
- Codeforces 1205C Palindromic Paths (交互题、DP)
题目链接 http://codeforces.com/contest/1205/problem/C 题解 菜鸡永远做着变巨的梦 然而依然连div1BC题都不会做 要是那天去打cf怕是又要1题滚粗了.. ...
- CodeForces - 1557D Ezzat and Grid(线段树+dp)
题目链接:点击查看 题目大意:给出 nnn 个 010101 串,现在问最少需要删掉多少个串,才能使得剩下的串拼起来是连通的 规定两个 010101 串是连通的,当且仅当存在至少一列,在两个串中都为 ...
- CodeForces - 1498D Bananas in a Microwave(思维+dp)
题目链接:点击查看 题目大意:给出 nnn 次操作,初始时有一个 k=0k=0k=0,每次操作抽象为三个数 txyt\ x\ yt x y,其中 xxx 可能为小数,可以选择一个 num∈[0,y]n ...
- CodeForces - 1354E Graph Coloring(dfs判断二分图+dp)
题目链接:点击查看 题目大意:给出一个由 n 个点和 m 条边组成的无向图,要求给 n 个点赋值为 1 . 2 或 3 ,需要满足以下条件: 每个点都需要被赋值 权值为 1 的点共 n1 个 权值为 ...
最新文章
- MySQL 学习笔记(10)—— 联结表
- pandas使用str函数和startswith函数,筛选dataframe中不是(not start with)以特定前缀开头的数据列(selecting columns)
- iOS开发那些事-平铺导航-基于Page的导航及案例实现
- c语言二极管控制程序,二极管(STC89C52): 编写程序控制二极管花样流水灯
- ESP32启明云端又有新玩法|基于ESP32+热像仪传感的物联网非接触智能测温终端为高考护航了
- Springmvc中提交from之后不跳转不进控制器
- protel中PCB板大小的自定义方法
- python 获取硬盘信息_使用python获取电脑的磁盘信息方法
- PHP设计模式——观察者模式
- 流媒体技术学习笔记之(十六)H264编码profile level控制
- NFC匹配电路与滤波器设计
- 使用Vue开发Chrome插件
- 如何更改Win8,8.1中文版到英文版,亲测!
- AHA Music插件:超好用的听歌识曲搜索工具
- 局部全局变量、匿名函数、递行函数
- 无人出租赛道洗牌开启?这家公司为什么会黄?
- python3.9.0 安装教程
- python计算长方体体积最简单代码_C语言编程简单的小程序,计算长方体体积!...
- 软件测试:保障软件质量的关键性关口——记中国工商银行软件开发中心北京研发_manok_新浪博客...
- .Net core--- IOC