日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AcWing 1087. 修剪草坪28

發布時間:2023/12/3 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AcWing 1087. 修剪草坪28 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

AcWing 1087. 修剪草坪

題意:

有n個數,不能選超過連續的k個數,問所能選的最大值是多少?

題解:


我們首先分析dp過程:
dp[i]表示選擇完前i個數的最大值
sum[i]表示前i項和
對于第i個數,它有兩個情況,選和不選
1.不選,dp[i]=dp[i-1]
2.選,那么以i為結尾的連續長度可以為1,也可以為2。。。,我們設所選的連續長度為j(1<=j<=k),那么這個區間就是[i-j+1,i],而第i-j個數就不選,再往前的區間答案就是dp[i-j-1]
所以此時dp[i]=dp[i-j-1]+sum[i]-sum[i-j]
i是固定的,j是不固定的,所以我們將式子變下形
dp[i]=(dp[i-j-1]-sum[i-j]) +sum[i] = g[i-j]+sum[i]
令g[i]=dp[i-1]-sum[i],這樣我們要讓dp[i]最大,就要讓g[i-j]最大,單調隊列維護下降序列得到區間長度為k的g[i]的最大值

代碼:

#include<bits/stdc++.h> #define debug(a,b) printf("%s = %d\n",a,b); typedef long long ll; using namespace std;inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w; } const int maxn=1e5+9; ll f[maxn]; ll s[maxn]; int q[maxn]; ll g(int i){if(i==0)return 0;return f[i-1]-s[i]; } int main() {int n,k;cin>>n>>k;for(int i=1;i<=n;i++){cin>>s[i];s[i]+=s[i-1];}int hh=0,tt=0;for(int i=1;i<=n;i++){if(q[hh]+k<i)hh++;f[i]=max(f[i-1],g(q[hh])+s[i]);while(hh<=tt&&g(q[tt])<=g(i))tt--;q[++tt]=i;}cout<<f[n];return 0; } /* dp[i]=dp[i-1] 當我們選擇連續長度為j時,(1<=j<=k) dp[i]=dp[i-j-1]+s[i]-s[i-j] */

總結

以上是生活随笔為你收集整理的AcWing 1087. 修剪草坪28的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。