蓝桥杯C语言培训6 分治法与动态规划 最大连续部分和
2018-03-21 22:20
302 查看
题目描述:
数组中整数有正有负求一连续子段,使得和最大化
例如:
2,4,-7,5,2,-1,2,-4,3
最大连续段:
5,2,-1,2
其最大和为8
代码:#include<bits/stdc++.h>
int a[9] = {2,4,-7,5,2,-1,2,-4,3};
int f(int a[],int start,int end)
{
if(end - start == 1)
{
if(a[start] > 0)return a[start];
return 0;
} //递归出口
int m = (start + end)/2;
int t1 = f(a,start,m);
int t2 = f(a,m,end); //左半边和右半边的连续和最大值
int t3a = 0;
int sum = 0;
for(int i = m ; i >= start ; i--)
{
sum += a[i];
if(sum > t3a)t3a = sum;
}
int t3b = 0;
sum = 0;
for(int i = m + 1 ; i <= end ; i++)
{
sum += a[i];
if(sum > t3b)t3b = sum;
}
int t3 = t3a + t3b; //以下标为m的元素为中心的连续和的最大值
int max = t3;
if(t1 > max)max = t1;
if(t2 > max)max = t2;
return max;
}
int main()
{
printf("%d\n",f(a,0,9));
return 0;
}
数组中整数有正有负求一连续子段,使得和最大化
例如:
2,4,-7,5,2,-1,2,-4,3
最大连续段:
5,2,-1,2
其最大和为8
代码:#include<bits/stdc++.h>
int a[9] = {2,4,-7,5,2,-1,2,-4,3};
int f(int a[],int start,int end)
{
if(end - start == 1)
{
if(a[start] > 0)return a[start];
return 0;
} //递归出口
int m = (start + end)/2;
int t1 = f(a,start,m);
int t2 = f(a,m,end); //左半边和右半边的连续和最大值
int t3a = 0;
int sum = 0;
for(int i = m ; i >= start ; i--)
{
sum += a[i];
if(sum > t3a)t3a = sum;
}
int t3b = 0;
sum = 0;
for(int i = m + 1 ; i <= end ; i++)
{
sum += a[i];
if(sum > t3b)t3b = sum;
}
int t3 = t3a + t3b; //以下标为m的元素为中心的连续和的最大值
int max = t3;
if(t1 > max)max = t1;
if(t2 > max)max = t2;
return max;
}
int main()
{
printf("%d\n",f(a,0,9));
return 0;
}
相关文章推荐
- 蓝桥杯C语言培训6 分治法与动态规划 二分查找
- 动态规划求取连续数组最大和
- hdu1003 最大连续子列和(动态规划★★★☆☆)
- 分治法对最大连续和以及归并排序,分治与递归实质把问题区间区域分割成几个小区间或者小分区,一直下钻到一个元素小区解决问题
- 在含有0的一百个整数中,找出连续三个数之和最大的部分
- 【动态规划】LCS算法:求两字符串最大公共字符串(连续)
- poj 1750Potted Flower(线段树 区间合并 动态规划 区间求最大连续和)
- (分治算法) 最大连续部分和
- 最大子段和——分治与动态规划
- 最大连续和--分治
- [ACM_动态规划] POJ 1050 To the Max ( 动态规划 二维 最大连续和 最大子矩阵)
- 最大子段和——分治与动态规划
- 【动态规划】求数组最大的子数组连续和
- 动态规划(4)最大连续子串问题
- A - Max Sum Plus Plus HDU1024 ( 动态规划 多段连续子段和的最大值)
- 动态规划求一个数组的连续最大和
- 分治 求最大连续和。
- 求数组中连续子元素的最大值(动态规划)
- POJ 2479 最大数字连续和 动态规划
- 求最大连续bit数-动态规划解法