diff --git a/213/step1.cpp b/213/step1.cpp new file mode 100644 index 0000000..f72f4f5 --- /dev/null +++ b/213/step1.cpp @@ -0,0 +1,41 @@ +/* +Solve Time: 18:45 + +Time Complexity: O(n) +Space Complexity: O(n) + +ある程度の方針は最初に建てられたが、正確なコードに落とし込む過程でミスを連発して時間がかかってしまった。 +最後の家を盗むかどうかの判定に、最初の家を盗んだかどうかの記録が必要になるので、2通りの配列を用意してそこで管理する。 + +*/ +class Solution { +public: + int rob(vector& nums) { + if (nums.size() == 1){ + return nums.front(); + } + + if (nums.size() == 2){ + return max(nums[0], nums[1]); + } + + vectormaxRobbedMoneyWithFirstRobbed(nums.size(), 0); + maxRobbedMoneyWithFirstRobbed[0] = nums[0]; + maxRobbedMoneyWithFirstRobbed[1] = nums[0]; + vectormaxRobbedMoneyWithoutFirstRobbed(nums.size(), 0); + maxRobbedMoneyWithoutFirstRobbed[1] = nums[1]; + + for (int i = 2; i < nums.size(); ++i) { + if (i < nums.size() - 1) { + maxRobbedMoneyWithFirstRobbed[i] = max(maxRobbedMoneyWithFirstRobbed[i - 1], maxRobbedMoneyWithFirstRobbed[i - 2] + nums[i]); + } else { + maxRobbedMoneyWithFirstRobbed[i] = maxRobbedMoneyWithFirstRobbed[i - 1]; + } + + maxRobbedMoneyWithoutFirstRobbed[i] = max(maxRobbedMoneyWithoutFirstRobbed[i - 1], maxRobbedMoneyWithoutFirstRobbed[i - 2] + nums[i]); + } + + return max(maxRobbedMoneyWithoutFirstRobbed.back(), maxRobbedMoneyWithFirstRobbed.back()); + + } +}; diff --git a/213/step2.cpp b/213/step2.cpp new file mode 100644 index 0000000..a9403e3 --- /dev/null +++ b/213/step2.cpp @@ -0,0 +1,36 @@ +/* + +2変数 * 2で行うパターン +必要な情報を詰め込んで変数名が長くなってしまっているのが難点 +*/ + +class Solution { +public: + int rob(vector& nums) { + if(nums.size() == 1) { + return nums[0]; + } + if(nums.size() == 2) { + return max(nums[0], nums[1]); + } + + int maxMoneyTwoPreRobWithFirstRob = nums[0]; + int maxMoneyOnePreRobWithFirstRob = nums[0]; + + int maxMoneyTwoPreRobWithoutFirstRob = 0; + int maxMoneyOnePreRobWithoutFirstRob = nums[1]; + + for (int i = 2; i < nums.size(); ++i) { + if (i < nums.size() - 1){ + int maxBenefitWithFirstRob = max(maxMoneyOnePreRobWithFirstRob, maxMoneyTwoPreRobWithFirstRob + nums[i]); + maxMoneyTwoPreRobWithFirstRob = maxMoneyOnePreRobWithFirstRob; + maxMoneyOnePreRobWithFirstRob = maxBenefitWithFirstRob; + } + + int maxBenefitWithoutFirstRob = max(maxMoneyOnePreRobWithoutFirstRob, maxMoneyTwoPreRobWithoutFirstRob + nums[i]); + maxMoneyTwoPreRobWithoutFirstRob = maxMoneyOnePreRobWithoutFirstRob; + maxMoneyOnePreRobWithoutFirstRob = maxBenefitWithoutFirstRob; + } + return max(maxMoneyOnePreRobWithFirstRob, maxMoneyOnePreRobWithoutFirstRob); + } +}; diff --git a/213/step3.cpp b/213/step3.cpp new file mode 100644 index 0000000..505c538 --- /dev/null +++ b/213/step3.cpp @@ -0,0 +1,32 @@ +/* +https://github.com/5ky7/arai60/pull/37 +を参考にstd::spanを使用。 +vectorをコピーせずにいい感じに渡す方法を探したらこのPRに辿り着いた。 +*/ +class Solution { +public: + int rob(vector& nums) { + if (nums.size() == 1) { + return nums.front(); + } + + std::span with_first_house(nums.begin(), nums.end() - 1); + std::span without_first_house(nums.begin() + 1, nums.end()); + return max(rob_linear(with_first_house), rob_linear(without_first_house)); + } + +private: + int rob_linear(std::span& nums) { + if (nums.size() == 1) { + return nums.front(); + } + int robbed_2_previous_max_money = nums[0]; + int robbed_previous_max_money = nums[1]; + for(int i = 2; i < nums.size(); ++i) { + int max_money = max(robbed_2_previous_max_money + nums[i], robbed_previous_max_money); + robbed_2_previous_max_money = max(robbed_2_previous_max_money, robbed_previous_max_money); + robbed_previous_max_money = max_money; + } + return max(robbed_previous_max_money, robbed_2_previous_max_money); + } +};