矩阵对角之间的走法常见问题之动态规划
2017-09-30 16:27
876 查看
1.在N*M的棋盘上,小兵要从左下角走到右上角,只能向上或者向右走,问有多少种走法
这是最常见的入门级别的动态规划问题的求解,但是问题的变种有很多,问题二回是在此基础上的衍生问题。
F(n,m)表示棋盘大小为n*m时走法数量,F(n,m) = F(n-1,m) + F(n,m-1) if n*m > 0,otherwise F(n,m) = 1
public class DP2 {
public static void main(String[] args) {
int n = 5;
int m = 4;
System.out.println(f(n,m));
}
static int f(int n,int m){
if(n==0||m==0)
return 0;
if(n==1||m==1)
return 1;
return f(n-1,m)+f(n,m-1);
}
}
2.输入一个矩阵num[m]
,现在从左上角(num[0][0])到达右下角num[m-1][n-1],且只能向下或者向右走。定义经过的所有点的数字之和为该条路径的收益,求到达右下角的最大收益。
* 用一个数组result[i][j]保存每一个点i,j的最大收益
* num[i][j],
i=j=0
* result[i][j] = result[i][j-1]+num[i][j], i = 0,j!=0
* result[i-1][j]+num[i][j], j = 0,i!=0
* Max(result[i-1][j],result[i][j-1])+num[i][j], j!=0,i!=0
public static void main(String[] args) {
int[][] num = {{1,2,3},{1,2,1},{0,7,5}};
int[][] result = getMax(num);
System.out.println(result[2][2]);
}
private static int[][] getMax(int[][] num) {
int m = num.length;
if(m==0){
return new int[0][0];
}
int n = num[0].length;
int[][] result = new int[m]
;
for (int jj = 0; jj < n; jj++) {
for (int ii = 0; ii < m; ii++) {
if(ii==0&&jj==0){
result[ii][jj] = num[ii][jj];
continue;
}
if(jj==0){
result[ii][jj] = result[ii-1][jj]+num[ii][jj];
continue;
}
if(ii==0){
result[ii][jj] = result[ii][jj-1]+num[ii][jj];
continue;
}
int max=Math.max(result[ii][jj-1],result[ii-1][jj]);
result[ii][jj] = max+num[ii][jj];
}
}
return result;
}
这是最常见的入门级别的动态规划问题的求解,但是问题的变种有很多,问题二回是在此基础上的衍生问题。
F(n,m)表示棋盘大小为n*m时走法数量,F(n,m) = F(n-1,m) + F(n,m-1) if n*m > 0,otherwise F(n,m) = 1
public class DP2 {
public static void main(String[] args) {
int n = 5;
int m = 4;
System.out.println(f(n,m));
}
static int f(int n,int m){
if(n==0||m==0)
return 0;
if(n==1||m==1)
return 1;
return f(n-1,m)+f(n,m-1);
}
}
2.输入一个矩阵num[m]
,现在从左上角(num[0][0])到达右下角num[m-1][n-1],且只能向下或者向右走。定义经过的所有点的数字之和为该条路径的收益,求到达右下角的最大收益。
* 用一个数组result[i][j]保存每一个点i,j的最大收益
* num[i][j],
i=j=0
* result[i][j] = result[i][j-1]+num[i][j], i = 0,j!=0
* result[i-1][j]+num[i][j], j = 0,i!=0
* Max(result[i-1][j],result[i][j-1])+num[i][j], j!=0,i!=0
public static void main(String[] args) {
int[][] num = {{1,2,3},{1,2,1},{0,7,5}};
int[][] result = getMax(num);
System.out.println(result[2][2]);
}
private static int[][] getMax(int[][] num) {
int m = num.length;
if(m==0){
return new int[0][0];
}
int n = num[0].length;
int[][] result = new int[m]
;
for (int jj = 0; jj < n; jj++) {
for (int ii = 0; ii < m; ii++) {
if(ii==0&&jj==0){
result[ii][jj] = num[ii][jj];
continue;
}
if(jj==0){
result[ii][jj] = result[ii-1][jj]+num[ii][jj];
continue;
}
if(ii==0){
result[ii][jj] = result[ii][jj-1]+num[ii][jj];
continue;
}
int max=Math.max(result[ii][jj-1],result[ii-1][jj]);
result[ii][jj] = max+num[ii][jj];
}
}
return result;
}
相关文章推荐
- 动态规划—矩阵连乘问题
- 常见动态规划例子(双调欧几里得旅行商问题、0-1背包问题等)
- 动态规划——矩阵连乘的问题
- 动态规划6:台阶问题和矩阵最小路径问题
- 常见的动态规划问题分析与求解
- 动态规划之矩阵连乘问题
- 动态规划问题3-矩阵连乘问题
- LeetCode 在矩阵中寻找路径类的动态规划问题
- 动态规划 之 矩阵连乘问题
- 动态规划:矩阵连乘问题
- 动态规划:矩阵连乘问题
- 51Nod1083--矩阵取数问题(动态规划,由递推式推得)
- 动态规划——矩阵连乘的问题
- 动态规划[入门]3-更难的矩阵取数问题
- 动态规划之矩阵链乘法问题
- 常见的动态规划问题分析与求解
- 动态规划经典问题——求矩阵相乘的最佳顺序
- 动态规划-矩阵连乘问题
- 常见的动态规划问题分析与求解
- 动态规划---矩阵连乘问题