思路
跟博客的上一题有些类似,都是对区间排序,然后去维护最靠右的位置。
$DP[i][j]$表示处理完第$i$个区间后,得到的值为$j$的区间最右边的位置。
因为区间按左端点排序,所以之前处理出的区间的左端点一定$\le$当前区间左端点,所以可以按下式进行DP。1
2
3
4
5if (j>=query[i].v && dp[pre][j-query[i].v]>=query[i].l) {
dp[cur][j]=max(dp[pre][j],min(dp[pre][j-query[i].v],query[i].r));
} else {
dp[cur][j]=dp[pre][j];
}
这种从左往右处理的问题有一点贪心的思路,只保留最右边的那一个。
代码
1 | //8 3 |