caioj 1085 动态规划入门(非常规DP9:尼克的任务)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34416123/article/details/82081209

这道题我一直按照往常的思路想
f[i]为前i个任务的最大空暇时间
然后想不出来怎么做……
后来看了题解
发现这里设的状态是时间,不是任务
自己思维还是太局限了,题做得太少。

设f[i]为前i时间内的最大空暇时间。
这里是更新后来的状态,和以前不一样。
如果i为某个任务的开始时间,则
f[i+t-1] = max(f[i+t-1], f[i])
也就是继承过去,取max
如果不是的话
f[i] = max(f[i], f[i-1] + 1)
加上获得的空暇时间
最后输出f[time],time为总时间

#include<cstdio>
#include<cstring>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;

const int MAXN = 11234;
int f[MAXN], time, n;
struct node
{
	int l, r;
	bool operator < (const node& rhs) const
	{
		return l < rhs.l || (l == rhs.l && r < rhs.r); 
	}
}a[MAXN];

int main()
{
	scanf("%d%d", &time, &n);
	REP(i, 1, n + 1) scanf("%d%d", &a[i].l, &a[i].r);
	sort(a + 1, a + n + 1);
	
	memset(f, -63, sizeof(f));
	f[0] = 0;
	int p = 1;
	REP(i, 1, time + 1)
	{
		if(a[p].l == i)
		{
			while(a[p].l == i)
				f[i + a[p].r - 1] = max(f[i + a[p].r - 1], f[i-1]), p++;
		}
		else f[i] = max(f[i], f[i-1] + 1);
	}
	printf("%d\n", f[time]);
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_34416123/article/details/82081209
今日推荐