整天初赛题做做,生活没有希望
用单调队列优化的dp
因为满足后来的总比先来的(在某些方面)更优
所以能用单调队列
n2变成n
1 #include <cstdio> 2 int n,m,a[1000001],b[1000001],c[1000001]; 3 int main() 4 { 5 scanf("%d%d",&n,&m); 6 for(int i=1;i<=n;i++) 7 scanf("%d",&a[i]); 8 int h=1,t=1;b[1]=0;c[1]=0; 9 for(int i=1;i<=n;i++) 10 { 11 while(b[h]+m<i) h++; 12 while(c[t]>c[h]+a[i]) t--; 13 b[++t]=i;c[t]=c[h]+a[i]; 14 } 15 while(b[h]+m<=n) h++; 16 printf("%d ",c [h]); 17 return 0; 18 }