通行证
- 积分
- 599
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2011-7-20
- 最后登录
- 1970-1-1
|
比如之前的例子 {2,3, 5, 8};Optimal solution 是
{2,3}-> 3
<-{2} 2
{5,8}-> 8
<-{3} 3
{2,3}-> 3
total cost 19;
Comparing with the naive greedy
{2,8}-> 8
<-{2} 2
{2,5}-> 5
<-{2} 2
{2,3}-> 3
total cost 20;- #include <vector>
- #include <unordered_map>
- #include <unordered_set>
- #include <map>
- #include <set>
- #include <queue>
- #include <cmath>
- #include <array>
- #include <algorithm>
- #include <numeric>
- #include <string>
- #include <list>
- #include <iostream>
- using namespace std;
- class Solution
- {
- private:
- vector<int> nums;
- unordered_map<string, int> dp1go;
- unordered_map<string, int> dp1back;
- public:
- Solution(vector<int> &_nums) : nums(_nums)
- {
- sort(nums.begin(), nums.end());
- };
- int solve1()
- {
- // brute force
- int n = nums.size();
- string s(n, '0');
- for (int i = 0; i < n; i++)
- {
- s[i] = '1';
- dp1go[s] = nums[i];
- s[i] = '0';
- }
- for (int i = 0; i < n; i++)
- {
- for (int j = i + 1; j < n; j++)
- {
- s[i] = '1';
- s[j] = '1';
- dp1go[s] = nums[j];
- s[i] = '0';
- s[j] = '0';
- }
- }
- string tmp(n, '1');
- return solve1go(tmp);
- }
- int solve1go(string &s)
- {
- // brute force
- auto it = dp1go.find(s);
- if (it != dp1go.end())
- return it->second;
- int n = s.size();
- int ret = INT_MAX;
- for (int i = 0; i < n; i++)
- {
- for (int j = i + 1; j < n; j++)
- {
- if (s[i] == '1' && s[j] == '1')
- {
- s[i] = '0';
- s[j] = '0';
- ret = min(ret, nums[j] + solve1back(s));
- s[i] = '1';
- s[j] = '1';
- }
- }
- }
- dp1go[s] = ret;
- return ret;
- }
- int solve1back(string &s)
- {
- auto it = dp1back.find(s);
- if (it != dp1back.end())
- return it->second;
- int n = s.size();
- int ret = INT_MAX;
- for (int i = 0; i < n; i++)
- {
- if (s[i] == '0')
- {
- s[i] = '1';
- ret = min(ret, nums[i] + solve1go(s));
- s[i] = '0';
- }
- }
- dp1back[s] = ret;
- return ret;
- }
- };
- int main()
- {
- vector<int> tmp{2, 3, 5, 8, 10, 110, 100};
- Solution sl(tmp);
- cout << sl.solve1() << endl;
- }
复制代码 |
|