Tony's Log

Algorithms, Distributed System, Machine Learning

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

A trickier DFS, with a little bit complex recursion param tweak, and what's more important is pruning strategies.. or your code will TLE.

class Solution {
    bool go(vector<bool> &m, int edge, int eleft, int etgt, vector<int> &in, int taken)
    {
        if(edge > 4) return false;
        if(edge == 4 && eleft == etgt && in.size() == taken)
        {
            return true;
        }
        int last = -1;
        for(int i = in.size()-1; i >=0; i --)
        {
            if(m[i]) continue;
            if(in[i] > eleft) continue; // because it is sorted
            if(in[i] == last) continue; // important: critical pruning.
            if(in[i] <= eleft)
            {
                m[i] = true;
                bool fit = in[i] == eleft;
                if(go(m, edge + (fit?1:0), fit?etgt:(eleft-in[i]), etgt, in, taken + 1))
                {
                    return true;
                }
                m[i] = false;
                last = in[i];
            }
        }
        
        return false;
    }
public:
    bool makesquare(vector<int>& nums) {
        if(nums.size() < 4) return false;
        
        int sum = accumulate(nums.begin(), nums.end(), 0);
        if(!sum || (sum % 4)) return false;
        
        sort(nums.begin(), nums.end());
        if (nums.back() > (sum/4)) return false;
        
        vector<bool> m(nums.size(), false);
        
        int tgt = sum / 4;
        return go(m, 0, tgt, tgt, nums, 0);
    }
};
posted on 2017-01-07 06:21  Tonix  阅读(160)  评论(0编辑  收藏  举报