动态规划:利用已有的计算结果来计算(减少冗余),具体表现为通过上一步的结果推算下一步。
1、爬楼梯:依赖i-1和i-2;
2、杨辉三角:依赖i-1;
3、打家劫舍:依赖i-1和i-2;
4、最长递增子数列:依赖全部j<i;二维,外层遍历,内层遍历递推(数字i大于数字j);
5、乘积最大子数组:依赖i-1;因为正负号存在,需要同时维护最大值和最小值。
背包问题:用物品装背包,二维动归问题;物品是否有限决定内部的遍历顺序,如果是有限的,则要由大到小遍历,保证上一层的结果不被覆盖。(背包问题其实有最多装多少,能否装满,装满所需最小个数)
1、*完全平方数:求装满所需最小数量。
2、*零钱兑换:求装满所需最小数量。
3、*单词拆分:求能否装满。外层增加长度,内层遍历递推(j为true且j,i在字典中);
4、分割等和子集:求能否装满。背包容量为总和一半,看能否把背包完全装满(实际上只能装满或在装不满,只要求出最大值,判断其是否等于背包容量即可)。