转换关系搞清楚了,但是关于那个单调性来处理DP的地方,还是不明白,应该是单调队列优化DP这个点不会,补一下代码,先学一下单调队列优化DP,
参考博客:点击打开链接
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 100005;
int f[maxn], g[maxn];int main()
{int l, n, p, t;scanf("%d%d%d%d", &l, &n, &p, &t);int head =1, tail = 1;f[head] = 0, g[head] = -t;int ans = 0;for (int i = 1; i <= n; i++){int x, y,ans1,ans2;scanf("%d%d", &x, &y);ans1 = ans2 = 0;if (head>1) head--;while (head <= tail&&g[head] + t <= y){int nx = max(x, g[head] + t);int ny = y;if (f[head] + (ny - nx) / p > ans1){ans1 = f[head] + (ny - nx) / p;ans2 = nx + (ny - nx) / p*p;}else if (f[head] + (ny - nx) / p == ans1){ans2 = min(ans2,nx + (ny - nx) / p*p);}++head;}if (ans1 > ans){ans = ans1;tail++;f[tail] = ans1;g[tail] = ans2;}}printf("%d\n", ans);return 0;
}