饭不食,水不饮,题必须刷
C语言免费动漫教程,和我一起打卡! 《光天化日学C语言》
LeetCode 太难?先看简单题! 《C语言入门100例》
数据结构难?不存在的! 《数据结构入门》
LeetCode 太简单?算法学起来! 《夜深人静写算法》
作为一个专业大盗,要开始执行偷窃任务。房屋按照线性排列,每间房内都藏有一定的现金,影响偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会报警。给定一个代表每个房屋存放金额的非负整数数组,计算 不触动警报装置 的情况下 ,一夜之内能够偷窃到的最高金额。
样例输入: [ 2 , 7 , 19 , 3 , 1 ] [2,7,19,3,1] [2,7,19,3,1]
样例输出: 22 22 22
class Solution {
public:
int rob(vector<int>& nums) {
}
};
LeetCode 198. 打家劫舍
比较直观的思路就是:如果第 i i i 个房间被偷窃,那么第 i − 1 i-1 i−1 个房间一定不能被偷窃。
如图所示:
绿色格子 代表当前要计算的状态;
红色格子 代表不能进行状态转移的状态;
蓝色格子 代表能够转移到绿色格子的状态;
灰色格子 则代表尚未计算出来的状态。
class Solution {
int f[110];
public:
int rob(vector<int>& nums) {
f[0] = nums[0];
int ans = f[0]; // (1)
for(int i = 1; i < nums.size(); ++i) {
f[i] = nums[i]; // (2)
for(int j = 0; j < i - 1; ++j) {
f[i] = max(f[i], nums[i] + f[j]); // (3)
}
ans = max(f[i], ans); // (4)
}
return ans;
}
};
动态规划的时间复杂度 = 状态数 × \times × 状态转移的时间复杂度。