zoukankan      html  css  js  c++  java
  • 第八章部分例题分治法

    分解问题,递归求解,合并解

    分成尽量相等的两部分

    分别求出完全位于左边的序列和右边的序列

    合并即在求出起点位于左边,终点位于右边的序列然后与左右的最优解比较

    时间复杂度O(nlogn)

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    const int maxn=100;
    int A[maxn];
    
    int maxsum(int* A,int x,int y)
    {
        if(y==x+1) return A[x];
    
        int m=x+(y-x)/2;
        int maxs=max(maxsum(A,x,m),maxsum(A,m,y));
    
        int L=A[m-1],v=0;
        for(int i=m-1;i>=x;i--) L=max(L,v+=A[i]);
    
        int R=A[m];
        v=0;
        for(int i=m;i<y;i++) R=max(R,v+=A[i]);
    
        return max(maxs,L+R);
    }
    
    int main()
    {
        int x=0;
        int y;
        cin>>y;
    
        for(int i=0;i<y;i++) cin>>A[i];
    
        int best=maxsum(A,x,y);    
    
        printf("%d
    ",best);
    
        return 0;
    }
    Yosoro
  • 相关阅读:
    家庭记事本开发进度1
    仓库信息管理系统
    文件与流动手动脑和课后作业
    课堂测试
    Java异常处理
    动手动脑五
    动手动脑4
    记录类的个数
    数据结构
    操作系统
  • 原文地址:https://www.cnblogs.com/tclan126/p/7478045.html
Copyright © 2011-2022 走看看