代码
这里自己能够想到的是状态压缩+剪纸以及回溯,至于动态规划个人直觉上有但是没有想出来。
var makesquare = function(matchsticks) {
var lon = 0;
let msk = 0 << matchsticks.length;
var memo = new Map(); // 记忆,避免重复扫描
for(let i = 0; i < matchsticks.length; i++) {
lon += matchsticks[i];
}
var side = lon / 4;
if(lon % 4 != 0) { return false; }
matchsticks.sort((a,b)=>{
return a - b;
});
if(matchsticks[0] > side) { return false; }
const dfs = (mask,t,c,d) => {
if(!memo.has(mask)) {
let res = false;
for(let i = 0; i < matchsticks.length; i++) {
if(((mask >> i) & 1) === 0) {
let t_mask = mask;
t_mask = mask | (1 << i);
let to = t + matchsticks[i];
let tc = c;
if(to == side) { to = 0; tc++;}
if(tc == 4 && d == matchsticks.length) {return true; }
if(tc == 4 && d < matchsticks.length) { return false; }
if(to > side) { continue; }
if(dfs(t_mask,to,tc,d + 1)) { res = true; }
}
}
memo.set(mask,res);
}
return memo.get(mask);
}
return dfs(msk,0,0,1);
};