(本部2定格)教育Codeforcesラウンド69 D

  • タイトル効果:指定された配列、および\(M、K \) シーク(\ \ sum_ {i = L } ^ {R}を{a_iを} -k \左\ lceil \ FRAC {R-L + 1} { 右\ rceil \)\ M}最小(空の配列を選択することができます)
  • 思考:わずか10メートル、最大ので、我々は、長さの各列挙でき\(1 M-1 \に)間隔(\(\左\ lceil \ {R&LT FRAC-L + 1} {M} \右\ rceilを1 = \)
    \(DP [I] \)の代表的なIに\(1 \)最大、最初の検索に\ + 1 \)(I-M iは、サブアレイの最大値、及び、直接還元行く\(K \)\(DP [IM] \)現在更新する\を(DP [I] \)

\ [DP [I] = MAX(DP [I]、DP [IM] +和[I] -sum [IM] -k); \]

  • 以来、\は(DP [IM] \)する正面を表し(IM \)\最大サブアレイ終了し、全体の転写をもたらすべきである\(m個\)長いセクション(連続サブアレイを保証するために注意を)
#include<bits/stdc++.h>
#define ll long long 
#define FOR(i,n) for(int i =1; i <= n;++i ) 
#define FOR0(i,n) for(int i =0; i < n;++i )  
#define inf 0x3f3f3f3f
using namespace std; 


const int maxn = 3e5+10;
ll n,k,m;
ll a[maxn];
ll sum[maxn];
ll dp[maxn];
int main(){
    cin >> n >> m>> k;
    FOR(i,n){
        cin >> a[i];
        sum[i] = sum[i-1] + a[i] ;
    }
    ll ans = 0;
    for(int i=1;i<=n;++i){
        for(int j=1;j<=m&&j<=i;++j){    // 枚举 1 到 m 的区间
            dp[i] = max(dp[i],sum[i]-sum[i-j]);
        }
        dp[i] -= k;
        dp[i] = max(dp[i],0LL);
        if(i>m){                        // 前一个 来更新当前的
            dp[i] = max(dp[i],dp[i-m]+sum[i]-sum[i-m]-k);
        }
        ans = max(ans,dp[i]);
    }
    cout << ans <<endl;
    return 0;
}

あまりにQAQ最大フィールドを書くと、本当にありません
(本部2定格)教育Codeforcesラウンド69

おすすめ

転載: www.cnblogs.com/xxrlz/p/11229780.html