最大连续子序列和 C++ 动态规划入门

最大连续子序列和 C++ 动态规划入门

    • 暴力枚举
    • 动规

问题描述:

选自算法笔记
样例输入:
6(表示有6个数据)
-2 11 -4 13 -5 -2
样例输出:
20
样例解释:
11 -4 13的和最大,为20

暴力枚举

直接对所有长度的序列求和,最后得到最大值
我的代码示意如下:

#include
#include 
using namespace std;
int GetSumMax(int arr[],int maxSum,int n,int num){//n表示此时所求连续的子串个数,num表示总数 
	if(n==num+1){return maxSum;}//递归终止条件 
	for(int i=0;i+n<=num;i++){
		int j=i+1,tempSum2=arr[i];
		for(int z=1;z<n;j++,z++){
			tempSum2+=arr[j];//累加 
		} 
		maxSum=max(maxSum,tempSum2);//更新最大值 
	}
	GetSumMax(arr,maxSum,n+1,num);//递归至遍历所有长度的连续子串
} 
int main(){
	int num=0;
	cin>>num;
	int arr[num];
	for(int i=0;i<num;i++){
		cin>>arr[i];
	}
	int maxSum=GetSumMax(arr,arr[0],1,num);//调用函数 
	cout<<maxSum;
	return 0;
}

动规

最大连续子序列和 C++ 动态规划入门_第1张图片

状态转移方程:
dp[i]=max(dp[i-1]+arr[i],arr[j]);
以下为我写的代码示例:

//动态规划 
#include
#include
using namespace std;

int main(){
	int num;
	cin>>num;
	int arr[num],dp[num]; 
	for(int i=0;i<num;i++){//读取数据 
		cin>>arr[i];dp[i]=0;
	}
	dp[0]=max(arr[0],0);//单列,防止越界 
	for(int i=1;i<num;i++){
		dp[i]=max(arr[i],dp[i-1]+arr[i]);//状态转移方程 
	}
	sort(dp,dp+num);//排序 
	cout<<dp[num-1];//输出最大值 
	return 0;
}
 

部分内容选自《算法笔记》

笔者较菜,若有不当,望指正。

你可能感兴趣的:(数据结构学习日记,c++,动态规划,算法)