1.今天学习了一个简单的求最大连续子数组的问题,给定一个数组A[0,…,n-1],求A的连续子数 组,使得该子数组的和最大。例如:数组: 1, -2, 3, 10, -4, 7, 2, -5
Python暴力求解法:
dest_arry = [1,-2,3,10,-4,7,-2,5,12]
max_val = dest_arry[0]
cuur_val = 0
start = 0
end = 0
print (len(dest_arry))
count = len(dest_arry)
#暴力法
for i in range(0, count):
for j in range(i, count):
cuur_val = 0
for k in range(i, j+1): #这个需要特别注意,在这里这句话的意思相当于是for( k=i,k<(j+1),k++),在python中没有'<='这个符号
cuur_val = cuur_val + dest_arry[k]
if(cuur_val > max_val):
max_val = cuur_val
start = i
end = k
print (max_val, start,end)
Python分治法:
#分治法
dest_arry = [1,-2,3,10,-4,7,-2,5,12]
max_val = dest_arry[0]
cuur_val = 0
start = 0
end = 0
print (len(dest_arry))
count = len(dest_arry)
def max_sub_add(fr, to):
global start
global end
if fr == to:
return dest_arry[fr]
mid = int((fr + to)/2)
m1 = max_sub_add(fr, mid)
m2 = max_sub_add(mid+1, to)
left = dest_arry[mid]
now = dest_arry[mid]
i = mid - 1
while(i>=fr):
now = now + dest_arry[i]
if(now > left):
left = now
start = i
i = i - 1
right = dest_arry[mid+1]
now = dest_arry[mid+1]
i = mid+2
while(i <= to):
now = now + dest_arry[i]
if (now> right):
right = now
end = i
i = i + 1
# for i in range(mid+2, to+1):
# now = now + dest_arry[i]
# if (now> right):
# right = now
# end = i
m3 = right + left
return max(m1, m2, m3)
start = 0
end = 0
result = max_sub_add(0, (count)-1)
print(result, start, end)
C/C++暴力法:
#include "stdio.h"
#include "stdlib.h"
void baoli()
{
int dest_arry[] = {1,-2,3,10,-4,7,-2,5,-12};
int max_val = dest_arry[0] , cuur_val = 0, start_nbr = 0, end_nbr = 0;
int count = sizeof(dest_arry) / sizeof(int);
int i = 0, j = 0, k = 0;
printf("count: %d
", count);
for( i = 0; i < count; i++)
{
for (j=i;j<count; j++)
{
cuur_val = 0;
for (k=i; k<=j; k++)
{
cuur_val = cuur_val + dest_arry[k];
if(cuur_val > max_val)
{
max_val = cuur_val;
start_nbr = i;
end_nbr = k;
}
}
}
}
printf("start: %d end_nbr: %d max_val: %d
", start_nbr, end_nbr, max_val);
}
int main()
{
baoli();
}