最大子段和(动态规划算法)
创作时间:
作者:
@小白创作中心
最大子段和(动态规划算法)
引用
CSDN
1.
https://blog.csdn.net/qq_46036056/article/details/121333701
最大子段和(动态规划算法)
一、思路
D[i]表示从i开始的最大字段和。(但我们不是从前往后找字段结束位置)
根据递推公式,我们可知要想求得D[i],就必须知道D[i+1],所以我们从前往后计算。
如下图:以i=12开始的子段和D[12]=X[12]=-1,该子段结束位置Rec[12]=i=12;
当i=11时,D[11+1]<0,所以D[11]=X[11]=7,Rec[i]=i=11;
当i=10时,D[10+1]>0,所以D[10]=X[10]+D[11]=3+7,Rec=i+1=11;
一直到i,我们就找完了所有子段和,接着在子段和中找最大的。
二、伪代码
三、C++代码
#include <iostream>
using namespace std;
void Dsum(int n,int X[],int D[],int Rec[])
{
int sum=D[1],l,r;
for(int i=2;i<=n;i++){
if(sum<D[i]){
sum=D[i];
l=i;
r=Rec[i];
}
}
cout<<"最长字段和为:"<<sum<<endl;
cout<<"最长字段为:";
for(int i=l;i<=r;i++)
cout<<X[i]<<' ';
cout<<endl;
}
void find(int n,int X[])
{//X[]中为数组的值
int D[n+1],Rec[n+1];//D[]中为以i为首的最大子段
//Rec[]中记录了每个字段的尾数字的位置
D[n]=X[n];//
Rec[n]=n;
for(int i=n-1;i>0;i--){//采用从后往前的计算
if(D[i+1]>0){
D[i]=X[i]+D[i+1];
Rec[i]=Rec[i+1];
}
else{
D[i]=X[i];
Rec[i]=i;
}
}
Dsum(n,X,D,Rec);//该函数用来寻找最大子段和,以及该子段的开始和结束位置
}
int main()
{
int n;
cout<<"请输入数组长度n:\n";
cin>>n;
int X[n+1];//为了方便,每个数组都是1~n(而不是0~n-1)
cout<<"请输入数组:\n";
for(int i=1;i<=n;i++)
cin>>X[i];
find(n,X);//该函数用来生成子段和
return 0;
}
/*
12
1 -2 4 5 -2 8 3 -2 6 3 7 -1
*/
四、输入实例
热门推荐
以前未交社保的情况如何解决?这种解决方式可能带来哪些变化?
彻底搞懂它!一文带你掌握函数定义域的秘密武器
二手房交易新手指南:如何自主完成网上签约
北京2024年人工智能产业发展成绩单:规模破3000亿,企业超2400家
南京玄武湖春意盎然:樱桃花、早樱竞相绽放,百花开春游园会启幕
20句治愈诗词,句句温暖人心,字字抚慰心灵,读完瞬间释怀!
市域机场线挤满上班族?为郊区居民通勤提供新选择,地产市场也闻风而动……
父母离婚后监护责任如何分担
如何为项目选择关系型数据库和非关系型数据库
小鼠脾脏CD8+T细胞提取分离实验步骤
网贷逾期无力偿还怎么办?教你正确沟通解决问题
中国养老产业竞争格局与市场集中度分析
紫芽茶是生茶还是熟茶,紫芽普洱茶特点
新人入坑必看!幻唐志:逍遥外传最强辅助门派无量(佛门)全解析
去不了远方,就去一趟江南吧,到杭州这6个地方,看浪漫春色
上海白云观:沪上道教文化的瑰宝
【Nature子刊综述】糖尿病视网膜病变的分子和细胞病理学机制研究进展
如何设计一个高效的可视化数字大屏布局?
宝宝上呼吸道感染怎么办
洛阳亲友如相问,一片冰心在玉壶。
60岁养老金每月多少钱?三种险种待遇计算
全栈工程师具备完全的开发能力,未来前景该如何考虑?
性是爱的一部分又为什么会有柏拉图式爱情
新研究:植物油比动物性黄油更健康
三字经全文带拼音
不疼也不痒,容易被忽略,视网膜脱离发生时应如何辨别?
范进中举后的官职:从落魄书生到省级教育厅长
账面价值怎么算?一文详解账面价值计算与相关概念
96岁李嘉诚罕见露面,关注家乡发展与医疗科技
一文搞懂EVT、DVT、PVT、MP及其实例