@@ -5,67 +5,77 @@ CS203_DSAA_template
55Copyright (C) 2020-2023 nanos
66
77*/
8- #include " divide_bar_test.hpp"
98
109#include < cstddef>
1110#include < cstdint>
1211#include < vector>
13-
12+ #include < algorithm>
13+ #include < tuple>
1414
1515namespace dp {
1616namespace divide_bar { // Introduction to Algorithms Edition3 Chapter15.1
17+
1718namespace iter {
18- int64_t maxProfit (const vector<int64_t > ÷_profits, size_t length) {
19- const auto minIter{std::min (divide_profits.size (), length)};
20- vector<int64_t > profits_table (length + 1 , -0x3f3f3f );
21- profits_table[0 ] = 0 ;
22- for (size_t i{0 }; i < minIter; ++i) {
23- profits_table[i + 1 ] = divide_profits[i];
24- }
25- for (size_t i{2 }; i <= length; ++i) {
26- for (size_t j{1 }; j < (i / 2 + 1 ); ++j) {
27- profits_table[i] = std::max (profits_table[i], profits_table[j] + profits_table[i - j]);
19+ class Solution {
20+ public:
21+ int64_t maxProfit (const std::vector<int64_t > ÷_profits, size_t length) {
22+ const auto minIter{std::min (divide_profits.size (), length)};
23+ std::vector<int64_t > profits_table (length + 1 , -0x3f3f3f );
24+ profits_table[0 ] = 0 ;
25+ for (size_t i{0 }; i < minIter; ++i) {
26+ profits_table[i + 1 ] = divide_profits[i];
2827 }
28+ for (size_t i{2 }; i <= length; ++i) {
29+ for (size_t j{1 }; j < (i / 2 + 1 ); ++j) {
30+ profits_table[i] = std::max (profits_table[i], profits_table[j] + profits_table[i - j]);
31+ }
32+ }
33+ return profits_table.back ();
2934 }
30- return profits_table. back () ;
35+ } ;
3136}
3237
3338namespace with_solution {
34- std::tuple<int64_t , vector<int64_t >> maxProfit (const vector<int64_t > ÷_profits, size_t length) {
35- const auto minIter{std::min (divide_profits.size (), length)};
36- vector<int64_t > profits_table (length + 1 , -0x3f3f3f );
37- vector<vector<int64_t >> segment_table (length + 1 );
38- profits_table[0 ] = 0 ;
39- segment_table[0 ] = {};
40- for (size_t i{0 }; i < minIter; ++i) {
41- profits_table[i + 1 ] = divide_profits[i];
42- segment_table[i + 1 ].push_back (static_cast <int64_t >(i + 1 ));
43- }
44- for (size_t i{2 }; i <= length; ++i) {
45- size_t left{0 }, right{0 };
46- for (size_t j{1 }; j < (i / 2 + 1 ); ++j) {
47- const auto sums = profits_table[j] + profits_table[i - j];
48- if (sums > profits_table[i]) { // 相对倾向于保留大块
49- profits_table[i] = sums;
50- left = j;
51- right = i - j;
52- }
39+ class Solution {
40+ public:
41+ std::tuple<int64_t , std::vector<int64_t >> maxProfit (const std::vector<int64_t > ÷_profits, size_t length) {
42+ const auto minIter{std::min (divide_profits.size (), length)};
43+ std::vector<int64_t > profits_table (length + 1 , -0x3f3f3f );
44+ std::vector<std::vector<int64_t >> segment_table (length + 1 );
45+ profits_table[0 ] = 0 ;
46+ segment_table[0 ] = {};
47+ for (size_t i{0 }; i < minIter; ++i) {
48+ profits_table[i + 1 ] = divide_profits[i];
49+ segment_table[i + 1 ].push_back (static_cast <int64_t >(i + 1 ));
5350 }
54- if (left != 0 && right != 0 ) {
55- auto mid = segment_table[left];
56- mid.insert (mid.end (), segment_table[right].cbegin (), segment_table[right].cend ());
57- segment_table[i] = mid; // 操作完成之后赋值,防止操作自己
51+ for (size_t i{2 }; i <= length; ++i) {
52+ size_t left{0 }, right{0 };
53+ for (size_t j{1 }; j < (i / 2 + 1 ); ++j) {
54+ const auto sums = profits_table[j] + profits_table[i - j];
55+ if (sums > profits_table[i]) { // 相对倾向于保留大块
56+ profits_table[i] = sums;
57+ left = j;
58+ right = i - j;
59+ }
60+ }
61+ if (left != 0 && right != 0 ) {
62+ auto mid = segment_table[left];
63+ mid.insert (mid.end (), segment_table[right].cbegin (), segment_table[right].cend ());
64+ segment_table[i] = mid; // 操作完成之后赋值,防止操作自己
65+ }
5866 }
67+ return std::make_tuple (profits_table.back (), segment_table.back ());
5968 }
60- return std::make_tuple (profits_table.back (), segment_table.back ());
61- }
69+ };
6270}
6371
64- }
6572namespace rec {
66- int64_t maxProfit (const vector<int64_t > ÷_profits, size_t length) {
67- return 0 ;
68- }
73+ class Solution {
74+ public:
75+ int64_t maxProfit (const std::vector<int64_t > ÷_profits, size_t length) {
76+ return 0 ;
77+ }
78+ };
6979}
7080
7181}
0 commit comments