• hdu1231 最大连续子序列


     /*线性时间算法*/
    1
    #include<iostream> 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <algorithm> 5 using namespace std; 6 #define NMax 10010 7 int A[NMax]; 8 9 int main() 10 { 11 int n = 0; 12 while (scanf("%d", &n), n) 13 { 14 for (int k = 0; k < n; ++k) 15 { 16 scanf("%d", &A[k]); 17 } 18 19 __int64 subSum = 0; 20 __int64 sum = -1; 21 int i = 0; 22 int j = 0; //和不小于0的连续子数组的和的最大下标 23 int nStart = 0; 24 int nEnd = 0; //最大和连续子数组的最大下标 25 for (int k = 0; k < n; ++k) 26 { 27 subSum += A[k]; 28 if (subSum < 0) 29 { 30 subSum = 0; 31 i = k + 1; 32 j = k + 1; 33 } 34 else 35 { 36 if (subSum > sum) 37 { 38 sum = subSum; 39 nStart = i; 40 nEnd = k; 41 } 42 } 43 } 44 45 if (sum == -1) 46 { 47 printf("%d %d %d ", 0, A[0], A[n - 1]); 48 } 49 else 50 { 51 printf("%lld %d %d ", sum, A[nStart], A[nEnd]); 52 } 53 } 54 return 0; 55 }
      1 /*分治法 子串要么在左边,要么在右边,要么包含中间那个元素*/
      2 #include<iostream>
      3 #include <stdio.h>
      4 #include <stdlib.h>
      5 #include <algorithm>
      6 using namespace std;
      7 #define  NMax 10010
      8 int A[NMax];
      9 void AcrossMidMaxSum(int& sum, int left, int mid, int right, int& nStart, int& nEnd)
     10 {
     11     int leftMaxSum = INT_MIN;
     12     int leftSum = 0;
     13     for (int i = mid; i >= left; --i)
     14     {
     15         leftSum += A[i];
     16         if (leftSum >= leftMaxSum)
     17         {
     18             leftMaxSum = leftSum;
     19             nStart = i;
     20         }
     21     }
     22 
     23     int rightMaxSum = INT_MIN;
     24     int rightSum = 0;
     25     for (int i = mid + 1; i <= right; ++i)
     26     {
     27         rightSum += A[i];
     28         if (rightSum > rightMaxSum)
     29         {
     30             rightMaxSum = rightSum;
     31             nEnd = i;
     32         }
     33     }
     34 
     35     sum = leftMaxSum + rightMaxSum;
     36 }
     37 
     38 void MaxSum(int& sum, int left, int right, int& nStart, int& nEnd)
     39 {
     40     if (left == right)
     41     {
     42         sum = A[left];
     43         nStart = left;
     44         nEnd = right;
     45         return;
     46     }
     47 
     48     int mid = (left + right) / 2;
     49 
     50     int leftSum = -1, nLeftStart, nLeftEnd;
     51     MaxSum(leftSum, left, mid, nLeftStart, nLeftEnd);
     52 
     53     int midSum = -1, nMidStart, nMidEnd;
     54     AcrossMidMaxSum(midSum, left, mid, right, nMidStart, nMidEnd);
     55 
     56     int rightSum = -1, nRightStart, nRightEnd;
     57     MaxSum(rightSum, mid + 1, right, nRightStart, nRightEnd);
     58 
     59     if (leftSum >= midSum && leftSum >= rightSum)
     60     {
     61         sum = leftSum;
     62         nStart = nLeftStart;
     63         nEnd = nLeftEnd;
     64     }
     65     else if (midSum >= leftSum && midSum >= rightSum)
     66     {
     67         sum = midSum;
     68         nStart = nMidStart;
     69         nEnd = nMidEnd;
     70     }
     71     else
     72     {
     73         sum = rightSum;
     74         nStart = nRightStart;
     75         nEnd = nRightEnd;
     76     }
     77 }
     78 
     79 void Test_1231_1()
     80 {
     81     int n = 0;
     82     while (scanf("%d", &n), n)
     83     {
     84         for (int k = 0; k < n; ++k)
     85         {
     86             scanf("%d", &A[k]);
     87         }
     88         int sum = -1, nStart, nEnd;
     89         MaxSum(sum, 0, n-1, nStart, nEnd);
     90         if (sum < 0)
     91         {
     92             printf("%d %d %d
    ", 0, A[0], A[n - 1]);
     93         }
     94         else
     95         {
     96             printf("%d %d %d
    ", sum, A[nStart], A[nEnd]);
     97         }
     98     }
     99 }
    100 
    101 
    102 int main()
    103 {
    104     //Test_1231_0();
    105     Test_1231_1();
    106     return 0;
    107 }
  • 相关阅读:
    关于博客
    latex句首缩进空格
    javable 之Iterable
    javable之Comparable
    常量池与Integer和String的“==”
    静态多态与动态多态
    String和StringBuilder效率不同的原理
    equals和hashcode
    Eclipse里面使用checkstyle(Google style)
    矩阵链乘问题
  • 原文地址:https://www.cnblogs.com/heqinghui/p/9063969.html
Copyright © 2020-2023  润新知