线性DP题,依靠大佬才调出来的我已经不敢说这是简单题了。。
思路:
设f[i]表示从1-i可以休息的时间
状态转移方程;
if(is[i]==0)
dp[i]=dp[i+1]+1
else
dp[i]=max{dp[i],dp[i+a[cnt].last-1]}
cnt表示当前的任务序号
AC代码:
/* P1280 尼克的任务 */
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 1e4 + 10;
struct Node
{
int st, la;
} a[maxn];
int tot = 1;
int all, n;
int dp[maxn];
bool cmp(const Node &a, const Node &b)
{
return a.st < b.st;
}
inline int read()
{
int x = 0, f = 1;
char ch = getchar();
while (!isdigit(ch))
f = (ch == '-') ? -1 : 1, ch = getchar();
while (isdigit(ch))
x = x * 10 + (ch - '0'), ch = getchar();
return x * f;
}
vector<int> b[maxn];
signed main()
{
all = read(), n = read();
for (int i = 1; i <= n; i++)
a[i].st = read(), a[i].la = read();
sort(a + 1, a + 1 + n, cmp);
for (int i = 1; i <= n; i++)
b[a[i].st].push_back(a[i].st + a[i].la - 1);
for (int i = all; i; i--)
{
if (b[i].empty())
dp[i] = dp[i + 1] + 1;
else
for (auto j : b[i])
dp[i] = max(dp[i], dp[j + 1]);
}
cout << dp[1] << '\n';
return 0;
}