题目:给定一个矩阵网络,一个机器人从左上角出发,每次可以向下或向右走一步 A:求有多少钟方式走到右下角(动态规划) B:输出所有走到右下角的路径(递归)
1.计数
有多少种方式走到右下角有多少种方法选出k个数使得和是sum2.求最大最小值
从左上角走到右下角路径的最大数字和最长上升子序列长度 Leetcode300 103.求存在性
取石子游戏,先手是否必胜能不能选出k个数使得和是sum你有三种硬币,分别面值2元,5元和7元,每种硬币都有足够多
买一本书需要27元如何用最少的硬币组合正好付清,不需要对象找钱(求最大最小值)解动态规划的时候需要开一个数组,数组的每个元素f[i]或者f[i][j]代表什么
类似于解数学题中x,y,z代表什么最后一步keyOne: 我们不关心前面的k-1枚硬币是怎么拼出27-ak的(可能有1种拼法,可能有100种拼法),而且我们现在甚至还不知道ak和k,但是我们确定前面的硬币拼出27-ak。
keyTwo:因为是最优策略,所以拼出27-ak的硬币数一定要最少,否则这就不是最优策略了。
递归解法的问题:
做了很多重复计算,效率低下如何避免?将计算结果保存下来,并改变计算顺序代码
class Solution { public int coinChange(int[] A,int M) { int[] f = new int[M+1]; int n = A.length; //initialization f[0]=0; int i,j; //f[1],f[2],...f[27] for (i=1;i<=M;++i){ f[i]=Integer.MAX_VALUE; //last coin A[j] //f[i] = min{f[i-A[0]]+1,...,f[i-A[n-1]]+1} for(j=0;j<n;++j){ if(i>=A[j]&&f[i-A[j]]!=Integer.MAX_VALUE){ f[i] = Math.min(f[i-A[j]]+1,f[i]); } } } if(f[M]==Integer.MAX_VALUE){ f[M]=-1; } return f[M]; } }给定一个矩阵网络,一个机器人从左上角出发,每次可以向下或向右走一步 求有多少钟方式走到右下角(动态规划)
class Solution { public int unique(int m,int n) { int[][] f =new int[m][n]; int i,j; for(i=0;i<m;++i){ //row:top to bottom for(j=0;j<n;++j){ //colum: left to right if(i==0||j==0){ f[i][j]=1; } else { f[i][j]=f[i][j-1]+f[i-1][j]; } } } return f[m-1][n-1]; } }有n块石头分别在x轴的0,1,…,n-1位置
一只青蛙在石头0,想跳到石头n-1
如果青蛙在第i块石头上,它最多可以向右跳距离ai
问青蛙能否跳到石头n-1
例子:
输入:a=[2,3,1,1,4]
输出:True
输入:a=[3,2,1,0,4]
输出:Fasle