分治法思想:
1.将问题划分为子问题的求解问题
2.递归求解子问题
3.将子问题的解合并,得到全局解
例子:最大连续和问题代码如下:
#include<stdio.h>
#define MAX 10000
int maxsum(int a[],int x,int y)
{
int m,max,l,r,max1,max2,v;
if(y-x==1)
return a[x];
m=x+(y-x)/2; //分治法第一步,将问题分成两个子问题
max1=maxsum(a,x,m); //分界点左边最大
max2=maxsum(a,m,y); //分界点右边最大
max=max1>max2?max1:max2; //分治法第二步,递归求解
v=0,l=a[m-1];
for(int i=m-1;i>=x;i--)//分界点向左的最大值
{
v+=a[i];
if(l<v)
l=v;
}
v=0,r=a[m];
for(int i=m;i<y;i++)//分界点向右的最大值
{
v+=a[i];
if(r<v)
r=v;
}
return max>(l+r)?max:(l+r);//将左右两边的最大连续和与分界点向两边扩展的最大和相比较,取最大
//得到整体最大连续和
}
void main()
{
int A[MAX];
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&A[i]);
printf("%d\n",maxsum(A,0,n));
}