动态规划是运筹学里面的一门学问,但是它被广泛的应用到了计算机算法领域。
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];
}