最大子段和(动态规划算法)
创作时间:
作者:
@小白创作中心
最大子段和(动态规划算法)
引用
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
*/
四、输入实例
热门推荐
多地调整房产落户政策,长沙市新落户政策会对人口流动产生何种影响?
兵役登记表盖章要去哪里?户口所在地街道可以吗?
新媒体运营:内容运营策略的制定与实施
湖北武汉大学生毕业后档案管理指南:查询、补办、调档和托管流程详解
干燥季救命指南:加湿器的正确打开方式,不允许你不知道→
乙酸乙酯的实验室合成步骤详解
新生儿上户口需要哪些材料
武汉眼科验光流程步骤:
《肖字取名测名:吉凶解释全解析》
怎样讲好慢病管理
配债怎么操作?一文详解配债流程及注意事项
幽门螺杆菌是吃出来的?为了肠胃健康,5种食物尽量少碰
健脑按摩法:提神醒脑、延缓认知衰退
C51单片机矩阵键盘输入&数码管静态显示
浅谈中西方语言、思维与文化差异的现代思考论文
新生儿一天睡眠多长时间正常
鸳鸯:忠贞的爱情伴侣
C语言程序调试中监视变量的详细教程
新能源汽车车辆购置税计算方法及依据是什么意思
解卦是看主卦还是变卦(如何正确理解卦象)
M3螺纹底孔的尺寸多大,M3螺纹底孔的应用有哪些
平顶山市二胎有陪产假吗
为何发展深海经济?发展潜力在哪?机构火速解读
我国再生涤纶行业现状:政策助力发展 终端市场需求恢复带动产量回升
如何进行客户缴费管理
70年产权到期后房子归谁?一文读懂中国住宅用地使用权制度
公司上市需要准备的资料
使用绿色植物打造室内自然氛围
食物不耐受与食物过敏:深入解析与比较
食物过敏做什么检查