做顺序DP做惯了,死活没想到这是个倒序DP。
f[i]表示时刻i的最大空闲时。有以下两种可能。
1.时刻i没有任务。此时f[i]=f[i+1]+1;
2.时刻i有许多任务。此时f[i]=max(f[i+持续时间s)。
改进了一下题解。不用排序,直接链式前向星建图!哈哈哈!
代码
#include<cstdio> #include<cctype> #include<iostream> #include<cstring> using namespace std; inline long long read(){ long long num=0,f=1; char ch=getchar(); while(!isdigit(ch)){ if(ch=='-') f=-1; ch=getchar(); } while(isdigit(ch)){ num=num*10+ch-'0'; ch=getchar(); } return num*f; } struct Edge{ int next,to; }edge[1000000]; int head[10010],num; inline void add(int from,int to){ edge[++num]=(Edge){head[from],to}; head[from]=num; } int f[100000]; int main(){ int n=read(),k=read(); for(int i=1;i<=k;++i){ int from=read(),dis=read(); add(from,dis); } for(int i=n;i;--i){ if(!head[i]) f[i]=f[i+1]+1; for(int j=head[i];j;j=edge[j].next) f[i]=max(f[i],f[i+edge[j].to]); } printf("%d",f[1]); return 0; }