给定n个整数(可能为负数)组成的序列A=<a1,a2,...,an>,求该序列连续的子段和的最大值。
#include<bits/stdc++.h>
using namespace std;
#define N 100
int s;
int num[N];
int fun(int s,int num[])
{
int tSum=0;
int maxSum=0;
for(int i=0;i<s;i++)
{
tSum=(tSum+num[i])>num[i]?(tSum+num[i]):num[i];
if(tSum>maxSum)
{
maxSum=tSum;
}
}
return maxSum;
}
int main()
{
memset(num,0,sizeof(num));
cout<<"请输入数字个数:";
cin>>s;
cout<<"请输入各个数字:";
for(int i=0;i<s;i++)
{
cin>>num[i];
}
int MaxSubsum=fun(s,num);
cout<<MaxSubsum<<endl;
return 0;
}
算法复杂度为:O(n)。 动态规划算法设计要点: (1) (划分)多阶段决策过程,每步处理一个子问题,界定子问题的边界(初值问题)。 (2) 列出优化函数的递推方程及初值(无比关键)。 (3) 问题要满足优化原则或者最优子结构性质。即:一个最优决策序列的任何子序列本身一定是相对于子序列的初始和结束状态的最优决策序列。