动态规划求最大子序列之和以及序列号

Posted 勇敢*牛牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划求最大子序列之和以及序列号相关的知识,希望对你有一定的参考价值。

动态规划

动态规划求最大子序列之和以及序列号

题目描述

给定一个数组,求此数组的子序列之和的最大值以及子序列的起始序号,末端序号
例如:数组:nums[9] = -2,1,-3,4,-1,2,1,-5,4
解释:最大值是:6,子序列号:3,6

代码描述

方法一:保留过程值

#include <stdio.h>
#include <stdlib.h>

int main() 
	int dp[9][9]  =0;//从第I位到第j位的最大连续子序列和 
	 
	int nums[9] = -2,1,-3,4,-1,2,1,-5,4;
	
	int i ,j,max = nums[0];
	dp[0][0]=nums[0];
	for(i=0;i<9;i++)
		for(j=i;j<9;j++)
			if(j>=1)
				dp[i][j] = dp[i][j-1] + nums[j];
				max = max > dp[i][j]?max:dp[i][j];	
			
			printf("%d=>%d is max=%d\\n",i,j,dp[i][j]);
		 	
	
	
	for(i=0;i<9;i++)
		for(j=0;j<9;j++)
			printf("%d ",dp[i][j]);
		 
		printf("\\n");
	
	printf("最大值是:%d",max);
	return 0;

代码效果

方法二:不保留过程值

#include<stdio.h>
int main()
	int nums[5] = 5,4,-1,7,8;
	int numsSize = 5;
	int size[2] = 0;
	int maxnum = nums[0], i, a = 0;
    for(i = 0; i<numsSize; i++)
//        a = (a + nums[i])>nums[i]?(a + nums[i]):nums[i];
		if((a + nums[i])>nums[i])
			a = (a + nums[i]);
		else
			a = nums[i];
			size[0] = i;	
		
        if(a>maxnum)
        	maxnum = a;
        	size[1] = i;
		
    
    printf("%d\\n", maxnum);
	 
    printf("%d,%d", size[0], size[1]);
    return 0;
 

以上是关于动态规划求最大子序列之和以及序列号的主要内容,如果未能解决你的问题,请参考以下文章

hdu1003 Max Sum最大连续子序列之和

动态规划——最大连续子序列和

动态规划——最大连续子序列和

动态规划例题

动态规划经典问题

动态规划求最大子序列