题意:中文题自己看
分析:
(这个题最扯淡的是m的值是1e4,然后最暴力的 m^2 的 dp 能过)
非常非常非常类似:最大不上升(下降)子序列。
初始 dp[?] = 1
然后往前看,如果位置 j 的数比位置 i 的数满足题意的条件,那么 dp 值更新。
本题一样
因为机器人的初始位置可控:等价于,我们只需要管过程中的位置和终点位置,起点无所谓。
意味着,对于当前 i,我们枚举之前的每一个 j,如果能到,那么就尝试 dp 更新。
能到 = 在给定的时间走到给定的位置。
代码。
#include<bits/stdc++.h>
using namespace std;
const int maxm = 1e5 + 20;
int t[maxm];
int x[maxm];
int y[maxm];
int dp[maxm];
int n,m;
int main(){
//freopen("input.txt", "r", stdin);
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; i++)
scanf("%d%d%d", &t[i], &x[i], &y[i]);
memset(dp, 0, sizeof(dp));
int ans = 0;
for(int i = 1; i <= m; i++){
dp[i] = 1;
for(int j = 1; j <= i-1; j++)
if (t[i] - t[j] >= abs(x[i] - x[j]) + abs(y[i] - y[j]))
dp[i] = max(dp[i], dp[j] + 1);
ans = max(ans, dp[i]);
}
printf("%d\n", ans);
return 0;
}



京公网安备 11010502036488号