矩阵对角之间的走法常见问题之动态规划

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][n],现在从左上角(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][n];
		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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值