【分治算法】例子

来源:互联网 发布:linux关闭防火墙 编辑:程序博客网 时间:2024/06/05 00:53

分治策略:

①、将问题分解成若干个小的子问题,每个子问题与大问题同型(所以里面可以用递归),但规模更小

②、递归解决这些子问题

③、将子问题的解答合并,获得大问题的解答

/*最大字段和问题*/#include <stdio.h>#include <stdlib.h>#include <iostream>using namespace std;int a[100];int maxsum_dac(int a[],int left,int right){int sum=0;int mid;int leftsum=0,rightsum=0; //leftsum存放左子数组的最大字段和,rightsum存放右子数组的最大字段和。 int s1=0,s2=0;int lefts=0,rights=0;   //在mid和mid+1往两边查找过程中,lefts,rights分别存放在寻找左数组最大字段和和寻找右数组最大字段和的过程过当前找到的值,它会不断更新 int i;if(left==right){sum=a[left]>0?a[left]:0;// if(a[left]>0){// sum=a[left];// }// else// sum=0;}else{mid=(left+right)/2;leftsum=maxsum_dac(a,left,mid);rightsum=maxsum_dac(a,mid+1,right);for(i=mid;i>=left;i--){lefts=lefts+a[i];if(lefts>s1)s1=lefts;}for(i=mid+1;i<=right;i++){rights=rights+a[i];if(rights>s2)s2=rights;}sum=s1+s2;if(sum<leftsum)sum=leftsum;if(sum<rightsum)sum=rightsum;}return sum;   //返回数组中的最大字段和sum }int main() {int i=1,k,sum=0;char c; cout<<"请输入任意个数的一组数据!(小于100个)"<<endl;    do    {        cin>>a[i++];        c=getchar();    }while(c!='\n');    i--;    sum=maxsum_dac(a,1,i);    cout<<"给定数组的最大字段和是:"<<sum<<endl;}