原题传送门

思路


本题难度本为入门难度,因为他的数据很小,用O(n2)的暴力算法就可以AC,但是,作为一个对于认为自己水题过多而感到羞愧的OIer,我决定用O(n)的算法来做这道题.

我不打算用前缀和(其实就是不会),用前缀和也可以做出O(n)的时间复杂度,但是很复杂,而且常数因子还比我接下来要介绍的算法的常数因子大,所以,我自认为我的这个算法是洛谷全站最好的(我翻了题解).

思想:贪心&动态规划

复杂度:时间复杂度O(n);空间复杂度O(n);

如果a[n]<a[m+1],那么a[n]~a[m]区间的和一定小于a[n+1]~a[m+1]区间的和.
而a[n+1]~a[m+1]区间的和减a[n]~a[m]区间的和就等于a[m+1]-a[n].
则用dp[m+1]表示a[m+1]-a[n],那么a[n+2]~a[m+2]区间的和减a[n]~a[m]区间的和就等于a[m+1]-a[n]+a[m+2]-a[n+1]也就是b[m+1]+a[m+2]-a[n+1].而他的值又可以用dp[m+2]表示
所以得到dp[m+1]到dp[m+2]的]状态转移方程为:dp[m+2]=dp[m+1]+a[m+2]-a[n+1].
所以dp[m+i-1]到dp[m+i]的状态转移方程为dp[i+m]=dp[i+m-1]+a[i+m]-a[i]

另外,若a[1]~a[m]就是最小的范围或者n=m,则程序会出现错误,需要特判:

if(dp[no]>0||n==m)//特判no=m;

剩下的就很简单了,直接上代码.

Code


#include <iostream>
#include <queue>
using namespace std;long long n,m,gkmin=99999999,ans,no;//我就是喜欢把gkmin设的大一点,你咬我啊
long long a[3002];
long long dp[3002];int main()
{cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=n-m;i++){dp[i+m]=dp[i+m-1]+a[i+m]-a[i];//状态转移if(gkmin>dp[i+m])gkmin=dp[i+m],no=i+m;}if(dp[no]>0||n==m)//特判no=m;for(int i=no;i>no-m;i--)ans+=a[i];cout<<ans;return 0;
}

后记

为了装逼敲一个高性能代码,我足足提交了20次左右,才AC.好吧,我承认是我自己在折磨我自己QAQ.
另外,此算法仍存在改进空间,可以用递归的迭代法代替动态规划的庞大dp数组,从而将空间复杂度降为O(1),但因为我懒,所以有兴趣的可以自行改进.

转载于:https://www.cnblogs.com/gongdakai/p/11031577.html

【动态规划】爱与愁的心痛相关推荐

  1. P1614 爱与愁的心痛(python3实现)

    爱与愁的心痛 - 洛谷 """P1614 爱与愁的心痛(python3实现) https://www.luogu.com.cn/problem/P1614"&q ...

  2. 洛谷——P1614 爱与愁的心痛

    P1614 爱与愁的心痛 题目背景 (本道题目隐藏了两首歌名,找找看哪~~~) <爱与愁的故事第一弹·heartache>第一章. <我为歌狂>当中伍思凯神曲<舞月光&g ...

  3. 洛谷 [P1614] 爱与愁的心痛 (前缀和)

    ❤️爱与愁的心痛

  4. 洛谷 P1617 爱与愁的一千个伤心的理由

    洛谷 P1617 爱与愁的一千个伤心的理由 题目 题目背景 (本道题目隐藏了两首歌名,找找看哪~~~) <爱与愁的故事第一弹·heartache>第二章. 经历了心痛后,爱与愁大神不行了. ...

  5. 洛谷——P1617 爱与愁的一千个伤心的理由

    P1617 爱与愁的一千个伤心的理由 题目背景 (本道题目隐藏了两首歌名,找找看哪~~~) <爱与愁的故事第一弹·heartache>第二章. 经历了心痛后,爱与愁大神不行了. 题目描述 ...

  6. 洛谷P1617 爱与愁的一千个伤心的理由

    写在前面的话 题目标题和题面啥关系没有....... 题目 题目简介:输入一个数(<=9999),输出英文写法. 分析 裸模拟. 所有的裸模拟:考察代码能力,毫无思维难度... 所以调了一个多小 ...

  7. P1617 爱与愁的一千个伤心的理由

    分成函数来写,两位数,三位数,四位数,不算难 #include <bits/stdc++.h>#define fi first #define se second #define pb p ...

  8. 洛谷入门篇的相关题解

    CF616A Comparing Two Long Integers 思路: 因为数字可能含有前导零,所以先对两个数字进行去除前导零的操作,操作后的两个数字如果位数相同,再逐位比较,否则,位数多的那个 ...

  9. 2017-2018年度刷题记录

    2018暑假刷题1: T1.CF6A Triangle (#模拟 -1.4) T2.CF59A Word(#模拟 -1.5) T3.[洛谷]P2772 寻找平面上的极大点(#贪心 -1.4) T4.[ ...

最新文章

  1. 如何到top5%?NLP-情感分析实战训练来教你!
  2. library “libopencv_java4.so“ not found“
  3. html css移动位置,html – 如何使用CSS移动对象?
  4. 英朗gt仪表盘图标说明_BuildRun低代码开发教程八节 | 图表和仪表盘展示
  5. NYOJ 311 完全背包
  6. rust实战入门到进阶(3)
  7. 闲谈简单设计(KISS)疑惑
  8. tomcat性能调优和性能监控(visualvm)
  9. python变量和对象的关系_Python变量与对象引用的区别
  10. python基础二:函数
  11. Mac好用的截图软件,这就来了!
  12. 淘宝 生成 图片二维码分享
  13. BUAA_4:Kevin·Feng的正确@姿势
  14. RefSeq Protein Accession转换为蛋白质(YP_009227197转换成Protein)
  15. 力扣(LeetCode)刷题笔记
  16. 最简单的机器学习入门:线性回归
  17. 使用spring的优势
  18. 计算机应用word优质课,全国“XX杯”说课大赛计算机应用基础类优秀作品:Word图文混排上课课件.ppt...
  19. html卡死手机,手机页面加载地图,双手操作放大,APP卡死
  20. VVC变换编码(一)MTS

热门文章

  1. 在论坛中出现的比较难的sql问题:33(递归 连续日期问题 )
  2. Count Complete Tree Nodes
  3. Windbg Extension NetExt 使用指南 【2】 ---- NetExt 的基本命令介绍
  4. 创新式开发探索(一) —— 开篇
  5. tomcat无法启动(JVM错误)
  6. Hacker News与Reddit的算法比较
  7. IIS上.Net 扩展中进行恢复
  8. Java内存溢出[转]和mysql配置文件简介[原创]
  9. mysql 数据库编程_MySQL数据库编程(C++语言)
  10. 服务器的文件共享,服务器文件共享