动态规划相关的题目:198. House Robber 和213. House Robber II都可以使用动态规划的方法
337. House Robber III的结构为树,不太方便用动态规划,有多种解法:
1:笨方法,使用递归的方法,在递归的时候尽量将代码简化即可使得不超时。
int rob(TreeNode* root)
{
if(root == NULL)
{
return 0;
}
if(root->left == NULL && root->right == NULL)
{
return root->val;
}
int max = rob(root->left)+rob(root->right);
int m = root->val;
if(root->left)
m+=(rob(root->left->left) + rob(root->left->right));
if(root->right)
m+=(rob(root->right->left) + rob(root->right->right));
return max>m?max:m;
}
2.升级的递归法(添加一个map来记录已经计算过的子树的值)
3.动态规划法(nrMax表示不抢劫根节点的最大值,rMax表示抢劫根节点的最大值)
void recVisit(TreeNode* root, int &nrMax, int &rMax)
{
int lrMax=0, lnrMax=0, rrMax=0, rnrMax=0;
if(root){
recVisit(root->left, lnrMax, lrMax);
recVisit(root->right, rnrMax, rrMax);
nrMax = max(lnrMax, lrMax) + max(rrMax, rnrMax);
rMax = root->val + lnrMax + rnrMax;
}
}
int rob(TreeNode* root) {
int rMax=0, res=0;
recVisit(root, nrMax, rMax);
return max(nrMax, rMax);
}