博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Educational Codeforces Round 69 (Rated for Div. 2) D
阅读量:5149 次
发布时间:2019-06-13

本文共 1235 字,大约阅读时间需要 4 分钟。

  • 题目大意: 给出一个序列,和\(m,k\),求\(\sum_{i=l}^{r}{a_i}-k\left \lceil \frac{r-l+1}{m} \right \rceil\)最小(可以选择空数组)
  • 思路: 由于m最大只有10,我们可以枚举每个长度为\(1 到m-1\)的区间(\(\left \lceil \frac{r-l+1}{m} \right \rceil=1\)).
    \(dp[i]\)代表从\(1到i\)的最大值,先求出\(i到i-m+1\)子数组的最大值,然后直接减去\(k\),在用\(dp[i-m]\)来更新当前的\(dp[i]\)

\[dp[i] = max(dp[i],dp[i-m]+sum[i]-sum[i-m]-k);\]

  • 因为\(dp[i-m]\)代表的是前面以\(i-m\)结尾的子数组的最大值,而且转移应携带整个\(m\)长的区间(保证取的子数组连续)
#include
#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 0x3f3f3f3fusing 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 <

写个最大字段和果然不能过QAQ

Educational Codeforces Round 69 (Rated for Div. 2)

转载于:https://www.cnblogs.com/xxrlz/p/11229780.html

你可能感兴趣的文章
[leetcode] (周赛)868. 二进制间距
查看>>
SVN提交时报错:Commit blocked by pre-commit hook (exit code 1) with no output.
查看>>
Linux下使用Curl调用Java的WebService接口
查看>>
洛谷P3203弹飞绵羊
查看>>
抗压能力
查看>>
Esfog_UnityShader教程_遮挡描边(原理篇)
查看>>
C#反射详解
查看>>
异常处理try...catch...finally中的finally关键字相关问题
查看>>
java语言总结
查看>>
Promise
查看>>
【原】java 中 sleep(1000) 和 wait(1000) 的区别?
查看>>
第八次作业--聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用
查看>>
java.util.properties
查看>>
Maven系列--"maven-compiler-plugin"的使用
查看>>
jquery表单验证
查看>>
android官方手册学习笔记
查看>>
iOS 同一个View识别单击和双击手势
查看>>
Linux 中权限控制实例
查看>>
js数组之迭代器方法
查看>>
创智天地半日游
查看>>