动态规划

动态规划是运筹学里面的一门学问,但是它被广泛的应用到了计算机算法领域。

1.将大问题化解为子问题(由于最终解最优,那么子问题也最优)
2.确定状态的表示与转换,并考虑边界问题。

总之就是大事化了,小事化小。
这里我们来看一个案列:
现在有一个m*n矩阵,每一个位置上都有若干个苹果,现在在左上角有一个小孩儿,小孩儿每次只能向下或者向右走,请问他怎么样行走得到的苹果最多?
大事化小:由题意可知,小孩儿要走到最右下角,他要获得最多那么就是他到最优下角的前一步最多。
小事化了:初始的个数为最左上角的个数。
我们用f(m,n)表示最多个数,arr[m][n]表示每个位置的个数,那么f(m,n) = max(f(m - 1,n), f(m, n-1)) + arr[m][n]。
所以可以有一下代码来实现:

public static int test(int[][] arr, int i, int j){
        if (i == 0 && j == 0){
            return arr[0][0];
        }
        if (i == 0){
            return test(arr, i, j - 1) + arr[i][j];
        }
        if (j == 0){
            return test(arr, i - 1, j) + arr[i][j];
        }
        return Math.max(test(arr, i - 1, j), test(arr, i, j - 1)) + arr[i][j];
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值