zoukankan      html  css  js  c++  java
  • 修剪草坪

    f[i][0],f[i][1]表示第i格奶牛选还是不选,

    f[i][0]=max(f[i-1][1],f[i-1][0]);

    f[i][1]=max(f[j][0]+sum[i]-sum[j])   i-k<=j<i   --->    f[i][1]=max(f[j][0]-sum[j])+sum[i]    i-k<=j<i   这样就可以用单调队列优化了

    这里j<i用先算再加来实现

     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 typedef long long ll;
     5 const int maxn=1e5+7;
     6 ll e[maxn],f[maxn][2],sum[maxn];
     7 ll n,k;
     8 int head=1,tail=1,q[maxn];
     9 int main(){
    10     cin>>n>>k;
    11     for(int i=1;i<=n;i++) {cin>>e[i];sum[i]=sum[i-1]+e[i];}
    12     for(int i=1;i<=n;i++){
    13         f[i][0]=max(f[i-1][0],f[i-1][1]);
    14         while(head<=tail&&q[head]<i-k) head++;  
    15         f[i][1]=f[q[head]][0]-sum[q[head]]+sum[i];
    16         while(head<=tail&&f[i][0]-sum[i]>=f[q[tail]][0]-sum[q[tail]]) tail--;
    17         q[++tail]=i; 
    18     }
    19     cout<<max(f[n][0],f[n][1])<<endl;
    20     return 0;
    21 } 

    第14行q[head]<i-k是没有等号的

  • 相关阅读:
    code3728 联合权值
    Codevs 4600 [NOI2015]程序自动分析
    code1540 银河英雄传说
    code1074 食物链
    堆排序
    哈夫曼树与哈夫曼码
    优先队列用法
    code1154 能量项链
    code1225 八数码Bfs
    javascript5
  • 原文地址:https://www.cnblogs.com/lcan/p/9577293.html
Copyright © 2011-2022 走看看