博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最大子段和(洛谷P1115,动态规划递推)
阅读量:7085 次
发布时间:2019-06-28

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

题目赋值出来格式有问题,所以我就只放题目链接了

 下面为ac代码

#include
#define ll long longusing namespace std;const ll maxn=200000+10;ll a[maxn];//存放输入的数据ll f[maxn];//用来递推int main(){ ll n; cin>>n; for(ll i=1;i<=n;i++) scanf("%lld",&a[i]);//输入数据 for(ll i=1;i<=n;i++) { f[i]=max(a[i],a[i]+f[i-1]); } ll ans=f[1];//先给ans赋初值为f[i] for(ll i=2;i<=n;i++)//这里的意思是让ans等于f[1~n]中最大的 if(f[i]>ans) ans=f[i]; cout<
<
点击加号展开代码

文字讲解(代码中也有部分注释):

f[i]数组的意义是以a[i]为末尾的序列中最大的总和

比如说序列1 3 4

那么f[1]=1,f[2]=1+3=4,f[3]=1+3+4=8

然后如果从左往后递推,也就是f[i],i从1~n

f[i],可以等于a[i],也可以等于f[i-1]+a[i]

这两个要看谁大,所以要用max函数,具体的递推方程就是:

f[i]=max(a[i],a[i]+f[i-1])

比如说当f[i-1]=4,a[i]=-1,那么f[i]就肯定选和f[i-1]合并比较好

那么如果f[i-1]=-1,a[i]=4,此时f[i]=a[i]能保证f[i]是以a[i]为末尾的序列中最大的总和

类似的栗子还有好多,可以自己举栗子看看

 

接下来推荐一道类似的知识点题目:

最长不下降子序列

 再贴一次代码

#include
#define ll long longusing namespace std;const ll maxn=200000+10;ll a[maxn];//存放输入的数据ll f[maxn];//用来递推int main(){ ll n; cin>>n; for(ll i=1;i<=n;i++) scanf("%lld",&a[i]);//输入数据 for(ll i=1;i<=n;i++) { f[i]=max(a[i],a[i]+f[i-1]); } ll ans=f[1];//先给ans赋初值为f[i] for(ll i=2;i<=n;i++)//这里的意思是让ans等于f[1~n]中最大的 if(f[i]>ans) ans=f[i]; cout<
<

 

转载于:https://www.cnblogs.com/zyacmer/p/9971269.html

你可能感兴趣的文章
分布式消息队列RocketMQ--事务消息--解决分布式事务的最佳实践
查看>>
flutter的log过滤,快速定位代码异常
查看>>
用idea配置c3p0连接池
查看>>
java泛型中使用的排序算法——归并排序及分析
查看>>
初识认知心理学
查看>>
通信相关
查看>>
hexo搭建github博客详解
查看>>
java 8 stream API<一>
查看>>
使用Blynk打造一款物联网产品
查看>>
iOS__在swift中实现debug隐藏打印日志
查看>>
论如何巧用链式语法逃出产品和后台魔爪
查看>>
Windows之MySQL安装教程
查看>>
GMQ稳定币助力完善数字货币体系
查看>>
Android 高仿腾讯新闻视频切换效果
查看>>
12月7日云栖精选夜读:特鲁多对话马云:请为加拿大小企业多花一些时间!
查看>>
计算机科学专业人工智能方向解析
查看>>
只有程序员才能看懂的15个瞬间
查看>>
好程序员大数据干货 SQL优化方案精解十则
查看>>
小程序安全设置-弹出框输入获取值
查看>>
Electron开发初体验
查看>>