标签:
我们发现这道题是有后效性的……前面的决策会对后面的产生影响……
所以我们可以反向考虑
f [ i ] 表示第i分钟至第n分钟的最大空闲时间
理论上应该排个序,不过默认有序了……
转移方程:如果该时间有任务开始,f [ i ] = max( f [ i ],f [ i+e [ i ] ])
如果没有任务,f [ i ]=f [ i+1] +1
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 using namespace std; 5 int n,k,f[10001],b[10001],e[10001]; 6 int main(){ 7 int tmp; 8 memset(f,0,sizeof(f)); 9 scanf("%d %d",&n,&k); 10 for (int i=1;i<=k;i++) 11 scanf("%d %d",&b[i],&e[i]); 12 for (int i=n;i>=1;i--){ 13 tmp=0; 14 while (b[k]==i){ 15 f[i]=max(f[i],f[i+e[k]]); 16 k--;tmp=1; 17 } 18 if (!tmp) f[i]=f[i+1]+1; 19 } 20 printf("%d",f[1]); 21 return 0; 22 }
标签:
原文地址:http://www.cnblogs.com/Absolute-Zero/p/5886625.html