1. 程式人生 > >尼克的任務 倒著dp

尼克的任務 倒著dp

參考了大佬的程式碼,倒著dp,正向的思路想不起來。

#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
const int maxn=1e4+5;
struct Node{
	int l,len; 
	bool operator<(const Node x)const{
		return this->l>x.l;
	}
}node[maxn];
int dp[maxn];
int main()
{
	memset(dp,inf,sizeof(dp));
	int n,k;
	cin>>n>>k;
	int i,j,len;
	for(i=1;i<=k;i++)
		scanf("%d%d",&node[i].l,&node[i].len);
	sort(node+1,node+k+1);
	for(i=1;i<=k;i++){//然後開始迴圈,dp裡記錄的是之後的時間段裡所能夠選擇的最大的空暇時間
		int l=node[i].l,len=node[i].len;
		for(j=l+len;inf==dp[j]&&j<=n;j++);
		if(inf==dp[j]) dp[l]=min(len,dp[l]);
		else	dp[l]=min(dp[j]+len,dp[l]);	
	}
	int cnt=0;
	for(i=1;i<=n&&inf==dp[i];i++);
	printf("%d",n-dp[i]);
	return 0;
}