最大子段和(动态规划算法)
创作时间:
作者:
@小白创作中心
最大子段和(动态规划算法)
引用
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
*/
四、输入实例
热门推荐
愚园路“红”了,快打卡去!
黄轩揭秘《蛟龙行动》幕后:从演员到“蛟龙队长”的蜕变之路
《蛟龙行动》揭秘潜艇部队:演员训练堪比实战,真实还原艇员生活
林超贤《蛟龙行动》:1300人团队打造,50个炸点实拍,中国电影工业新高度
人类文明的基石——认知革命与农业革命
浙江西塘古镇探秘:游玩攻略与指南全解析
掌握矩阵行列式,轻松应对考研数学
高斯与矩阵理论:从线性方程组到数据拟合
矩阵积在物理实验中的神奇应用:从基础概念到前沿研究
洱海周边摄影攻略:东、西岸精选景点与拍摄技巧
云南的秋天刚开始,接下来三个月,这些地方绚丽如画
手机无法识别SIM卡?跟着步骤走,轻松搞定问题!
加密文件夹:保护你的隐私不被黑客盯上!
徐怀钰2024演唱会门票开抢!你准备好了吗?
徐怀钰:用音乐温暖山区孩子,让"女人花"绽放得更美
杭州河坊街:南宋御街与胡庆余堂的文化传承与创新
如何正确确定定损金额?定损过程中有哪些关键因素?
夜游黄果树:秋日里的浪漫邂逅
关于转机,你需要知道的八个问题
《篮球旋风》:以精良制作和角色设计点燃青春梦想
《篮球旋风》点燃青少年篮球梦,助力中国篮球事业发展
《篮球旋风》:团队协作的力量
养猫能否有效控制老鼠问题?
民间土法捕鼠五法推荐
厨房成蟑螂乐园?教你几个高效防治技巧,安全又有效!
人工智能时代的大学专业选择:哪些专业更具发展潜力?
安顺:全力推进“气象+旅游”融合发展
赵露思公开抑郁症:一个公众人物的责任与勇气
五款朱雀汤的功效与选择指南
杭州如何去乌镇最方便