【动态规划】爱与愁的心痛
原题传送门
思路
本题难度本为入门难度,因为他的数据很小,用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
【动态规划】爱与愁的心痛相关推荐
- P1614 爱与愁的心痛(python3实现)
爱与愁的心痛 - 洛谷 """P1614 爱与愁的心痛(python3实现) https://www.luogu.com.cn/problem/P1614"&q ...
- 洛谷——P1614 爱与愁的心痛
P1614 爱与愁的心痛 题目背景 (本道题目隐藏了两首歌名,找找看哪~~~) <爱与愁的故事第一弹·heartache>第一章. <我为歌狂>当中伍思凯神曲<舞月光&g ...
- 洛谷 [P1614] 爱与愁的心痛 (前缀和)
❤️爱与愁的心痛
- 洛谷 P1617 爱与愁的一千个伤心的理由
洛谷 P1617 爱与愁的一千个伤心的理由 题目 题目背景 (本道题目隐藏了两首歌名,找找看哪~~~) <爱与愁的故事第一弹·heartache>第二章. 经历了心痛后,爱与愁大神不行了. ...
- 洛谷——P1617 爱与愁的一千个伤心的理由
P1617 爱与愁的一千个伤心的理由 题目背景 (本道题目隐藏了两首歌名,找找看哪~~~) <爱与愁的故事第一弹·heartache>第二章. 经历了心痛后,爱与愁大神不行了. 题目描述 ...
- 洛谷P1617 爱与愁的一千个伤心的理由
写在前面的话 题目标题和题面啥关系没有....... 题目 题目简介:输入一个数(<=9999),输出英文写法. 分析 裸模拟. 所有的裸模拟:考察代码能力,毫无思维难度... 所以调了一个多小 ...
- P1617 爱与愁的一千个伤心的理由
分成函数来写,两位数,三位数,四位数,不算难 #include <bits/stdc++.h>#define fi first #define se second #define pb p ...
- 洛谷入门篇的相关题解
CF616A Comparing Two Long Integers 思路: 因为数字可能含有前导零,所以先对两个数字进行去除前导零的操作,操作后的两个数字如果位数相同,再逐位比较,否则,位数多的那个 ...
- 2017-2018年度刷题记录
2018暑假刷题1: T1.CF6A Triangle (#模拟 -1.4) T2.CF59A Word(#模拟 -1.5) T3.[洛谷]P2772 寻找平面上的极大点(#贪心 -1.4) T4.[ ...
最新文章
- 如何到top5%?NLP-情感分析实战训练来教你!
- library “libopencv_java4.so“ not found“
- html css移动位置,html – 如何使用CSS移动对象?
- 英朗gt仪表盘图标说明_BuildRun低代码开发教程八节 | 图表和仪表盘展示
- NYOJ 311 完全背包
- rust实战入门到进阶(3)
- 闲谈简单设计(KISS)疑惑
- tomcat性能调优和性能监控(visualvm)
- python变量和对象的关系_Python变量与对象引用的区别
- python基础二:函数
- Mac好用的截图软件,这就来了!
- 淘宝 生成 图片二维码分享
- BUAA_4:Kevin·Feng的正确@姿势
- RefSeq Protein Accession转换为蛋白质(YP_009227197转换成Protein)
- 力扣(LeetCode)刷题笔记
- 最简单的机器学习入门:线性回归
- 使用spring的优势
- 计算机应用word优质课,全国“XX杯”说课大赛计算机应用基础类优秀作品:Word图文混排上课课件.ppt...
- html卡死手机,手机页面加载地图,双手操作放大,APP卡死
- VVC变换编码(一)MTS
热门文章
- 在论坛中出现的比较难的sql问题:33(递归 连续日期问题 )
- Count Complete Tree Nodes
- Windbg Extension NetExt 使用指南 【2】 ---- NetExt 的基本命令介绍
- 创新式开发探索(一) —— 开篇
- tomcat无法启动(JVM错误)
- Hacker News与Reddit的算法比较
- IIS上.Net 扩展中进行恢复
- Java内存溢出[转]和mysql配置文件简介[原创]
- mysql 数据库编程_MySQL数据库编程(C++语言)
- 服务器的文件共享,服务器文件共享