<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++

    主站蜘蛛池模板: 欧亚精品一区三区免费| 无码少妇精品一区二区免费动态| 香蕉97超级碰碰碰免费公| 亚洲美女又黄又爽在线观看| 无码 免费 国产在线观看91| 免费一级肉体全黄毛片| 免费无码又爽又黄又刺激网站| 国产精品免费看久久久久| 欧洲亚洲国产精华液| 国产免费一区二区三区VR| 国产精品亚洲天堂| 亚洲AV网站在线观看| 人成电影网在线观看免费| 亚洲精品乱码久久久久久不卡| 一级女性全黄久久生活片免费| 亚洲精品亚洲人成在线观看下载| 男女一进一出抽搐免费视频| 亚洲国产精品VA在线观看麻豆 | 亚洲日韩精品无码专区加勒比| 天天摸天天碰成人免费视频| 精品久久久久亚洲| 亚洲中文字幕久久精品无码APP | 人妻丰满熟妇无码区免费| 亚洲影视一区二区| 国产精品成人无码免费| 永久免费观看黄网站| 亚洲va久久久噜噜噜久久| 成人免费福利视频| 国产亚洲综合一区二区三区| 久久国产成人精品国产成人亚洲| 午夜老司机永久免费看片| 亚洲五月综合缴情婷婷| 亚洲AV成人精品日韩一区18p| 中文字字幕在线高清免费电影| 亚洲美女大bbbbbbbbb| 国产免费无遮挡精品视频| 成人A毛片免费观看网站| 亚洲的天堂av无码| 四虎影库久免费视频| 999任你躁在线精品免费不卡| 亚洲国产一区二区三区在线观看|