<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    so true

    心懷未來,開創(chuàng)未來!
    隨筆 - 160, 文章 - 0, 評論 - 40, 引用 - 0
    數(shù)據(jù)加載中……

    calculate the maximum sum of sub-sequence in array

    #include <iostream>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/time.h>
    #include <string>
    #include <fstream>
    #include <sstream>
    #include <stdint.h>
    #include <pthread.h>
    #include <vector>
    #include <map>
    #include <set>

    using namespace std;

    void print_array(int* ary, int len) {
        for (int i = 0; i < len; ++i) {
            if (0 == i) {
                printf("%3d", ary[i]);
            } else {
                printf(" %3d", ary[i]);
            }
        }
        printf("\n");
    }

    int calc_max_sum2(int* ary, int len) {
        int max_ele = 1 << (8 * sizeof(int) - 1);
        int max_ele_pos = -1;
        int max = 0;

        int sum = 0;
        int start_pos = 0;
        int max_end_pos = -1;
        int max_start_pos = -1;
        for (int i = 0; i < len; ++i) {
            if (ary[i] > max_ele) {
                max_ele = ary[i];
                max_ele_pos = i;
            }
            sum += ary[i];
            if (sum < 0) {
                sum = 0;
                if (i + 1 < len) {
                    start_pos = i + 1;
                }
            } else if (sum > max) {
                max = sum;
                max_end_pos = i;
                max_start_pos = start_pos;
            }
        }

        if (max_ele < 0) {
            max = max_ele;
            max_start_pos = max_ele_pos;
            max_end_pos = max_ele_pos;
        }

        printf("algorithm 2: max subsequence starts from %d, length:%d, max result:%d\n", max_start_pos, max_end_pos - max_start_pos + 1, max);
        print_array(ary + max_start_pos, max_end_pos - max_start_pos + 1);

        return max;
    }

    int calc_max_sum1(int* ary, int len) {
        if (NULL == ary || 0 == len) {
            return 0;
        }

        int max_ele = 1 << (8 * sizeof(int) - 1);
        int max_ele_pos = -1;

        int max_sum = 0;
        int max_start_pos = -1;
        int max_end_pos = -1;

        int cur_sum = 0; //reserve the optimal state
        int start_pos = -1; //record the start pos for cur_sum
        int end_pos = -1;//record the end pos for cur_sum
        int part_sum = 0; //track the incremental part, and merge into cur_sum once it is positive
        for (int i = 0; i < len; ++i) {
            if (ary[i] > max_ele) {
                max_ele = ary[i];
                max_ele_pos = i;
            }
            part_sum += ary[i];
            if (part_sum < 0) {
                if (cur_sum + part_sum < 0) {
                    if (cur_sum > max_sum) {
                        max_sum = cur_sum;
                        max_start_pos = start_pos;
                        max_end_pos = end_pos;
                    }

                    cur_sum = 0;
                    start_pos = -1;
                    end_pos = -1;
                    part_sum = 0;
                }
            } else if (part_sum > 0) {
                cur_sum += part_sum;
                part_sum = 0;
                end_pos = i;
                if (-1 == start_pos) {
                    start_pos = i;
                }
            }
            //printf("%3d, cur_sum:%3d, start_pos:%3d, end_pos:%3d, part_sum:%3d, max_sum:%3d, max_start_pos:%3d, max_end_pos:%3d\n", i, cur_sum, start_pos, end_pos, part_sum, max_sum, max_start_pos, max_end_pos);
        }
        if (cur_sum > max_sum) {
            max_sum = cur_sum;
            max_start_pos = start_pos;
            max_end_pos = end_pos;
        }

        if (max_ele < 0) {
            max_sum = max_ele;
            max_start_pos = max_ele_pos;
            max_end_pos = max_ele_pos;
        }

        printf("algorithm 1: max subsequence starts from %d, length:%d, max result:%d\n", max_start_pos, max_end_pos - max_start_pos + 1, max_sum);
        print_array(ary + max_start_pos, max_end_pos - max_start_pos + 1);

        return max_sum;
    }

    int calc_sum(int* ary, int len) {
        int sum = 0;
        for (int i = 0; i < len; ++i) {
            sum += ary[i];
        }

        return sum;
    }

    int calc_max_sum_by_enumerate(int* ary, int len) {
        int max = 1 << (8 * sizeof(int) - 1);
        int begin = -1;
        int max_len = -1;
        for (int i = 0; i < len; ++i) {
            for (int j = i; j < len; ++j) {
                int sum = calc_sum(ary + i, j - i + 1);
                if (sum > max) {
                    max = sum;
                    begin = i;
                    max_len = j - i + 1;
                }
            }
        }

        printf("algorithm of enumerate: max subsequence starts from %d, length:%d, max result:%d\n", begin, max_len, max);
        print_array(ary + begin, max_len);

        return max;
    }

    int main(int argc, char* argv[]) {
        int* ary = NULL;
        int len = 0;
        if (argc > 2) {
            len = argc - 1;
            ary = new int[len];
            for (int i = 1; i < argc; ++i) {
                ary[i - 1] = atoi(argv[i]);
            }
        } else if (2 == argc) {
            len = atoi(argv[1]);
            ary = new int[len];
            struct timeval tv;
            gettimeofday(&tv, NULL);
            srandom(tv.tv_usec);
            for (int i = 0; i < len; ++i) {
                ary[i] = (random() % 20) - 10;
            }
        } else {
            int tmp_ary[] = {-4, 6, -5, 3, -3, 4, -2};
            len = sizeof(tmp_ary) / sizeof(tmp_ary[0]);
            ary = new int[len];
            memcpy(ary, tmp_ary, sizeof(tmp_ary));
        }
        print_array(ary, len);
        int ret1 = calc_max_sum1(ary, len);
        int ret2 = calc_max_sum2(ary, len);
        int max = calc_max_sum_by_enumerate(ary, len);
        if (ret1 != max) {
            printf("algorithm 1 fails, result is %d, but the right answer is %d\n", ret1, max);
        } else if (ret2 != max) {
            printf("algorithm 2 fails, result is %d, but the right answer is %d\n", ret2, max);
        } else {
            printf("algorithm succeeds, max result:%d\n", max);
        }

        delete [] ary;
        return 0;
    }

    posted on 2015-03-10 10:52 so true 閱讀(277) 評論(0)  編輯  收藏 所屬分類: C&C++

    主站蜘蛛池模板: 国产亚洲精品国看不卡| 综合偷自拍亚洲乱中文字幕| 亚洲国产精品视频| 啦啦啦高清视频在线观看免费| 野花香高清视频在线观看免费 | 国产成人无码区免费内射一片色欲 | 色偷偷亚洲男人天堂| 亚洲国产成人久久99精品| 色噜噜AV亚洲色一区二区| 免费人成视频x8x8入口| 天天操夜夜操免费视频| 国产精品1024永久免费视频| 国内精品一级毛片免费看| 久久久久久久久久免免费精品| 白白色免费在线视频| 亚洲AV无码片一区二区三区| 亚洲熟女乱色一区二区三区| 亚洲国产精品日韩在线观看| 久久精品国产亚洲av麻豆小说| 国产亚洲精品无码成人| 亚洲香蕉网久久综合影视| 亚洲色偷偷狠狠综合网| 亚洲成aⅴ人片久青草影院| 国产伦精品一区二区三区免费下载| 久久久久久国产精品免费免费| 台湾一级毛片永久免费| 一个人免费观看在线视频www| 又黄又爽又成人免费视频| 亚洲成人免费在线观看| 亚洲毛片免费观看| 成年人免费的视频| 岛国av无码免费无禁网站| 性做久久久久久免费观看| 一本岛高清v不卡免费一三区| 日韩免费一区二区三区在线播放| 亚洲精品免费在线视频| 毛片a级三毛片免费播放| 日韩一区二区在线免费观看| 免费一区二区三区四区五区| 亚洲人成色77777在线观看大| 久久久久久亚洲精品不卡|