198
这道题可以用二维dp做,dp[i][0]表示第i间房偷,dp[i][1]表示第i间房不偷,dp[i][0]=dp[i-1][1]+nums[i];dp[i][1]=max(dp[i-1][0],dp[i-1][1])。
279
这道题是背包类问题,可以把总和当作背包的容量,遍历过程中每个序号的和当作物品,dp数组表示装入物品数的最小值。
class Solution {
public:
int numSquares(int n) {
vector<int> dp(n+1,INT_MAX);
dp[0]=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j*j<=i;j++)
{
dp[i]=min(dp[i],dp[i-j*j]+1);
}
}
return dp[n];
}
};
322
这道题的解法和上面那道题是一样的。