P1280 尼克的任务
思路
由于题目要求在空暇时间有任务开始时必须完成该任务,那么可以认为开始时间是受限的,如果以结束时间作为状态可能会导致前端不符合题意(可接任务而不接)。因此必须以开始时间作为状态。状态的转移由后端得来,而正序遍历时后端的数据还未进行转移,是未知的,所以需要倒序遍历,那么就可以设 dp[ i ] 为从 i 到 n 的最大空暇时间。如果 i 点空暇得到转移 dp[ i ] = dp[ i+1 ]+1 ,如果 i 点是起点,那么就从终点进行转移,dp[ i ] = max( dp[ i ], dp[ i + t[ j ] ] )。
代码
#include<iostream>
#include<algorithm>
using namespace std;
struct Node {
int s, t;
bool operator < (const Node& A)const {
if (s != A.s) return s < A.s;
else return t < A.t;
}
}arr[10007];
int dp[10007], n, k, ans;
int main(void)
{
cin >> n >> k;
for (int i = 1; i <= k; i++)
cin >> arr[i].s >> arr[i].t;
sort(arr + 1, arr + k + 1);
for (int i = n; i >= 1; i--)
{
int pos = k; bool flag = false;
while (arr[pos].s != i && pos > 0)pos--;
while (arr[pos].s == i) {
dp[i] = max(dp[i], dp[i + arr[pos].t]);
--pos; flag = true;
}
if (!flag) dp[i] = dp[i + 1] + 1;
}
cout << dp[1] << endl;
return 0;
}

浙公网安备 33010602011771号