动态规划的进一步理解
2014-05-15 15:15
162 查看
动态规划为了求取全局最优解,重新建立一个 dp 数组,用来存储当前最优值,直到达到全局最优值为止。
例如:一块N*M的矩形土地被分成N*M个小块,每一小块有不同数量的硬币,如果我从这块土地的左上角出发,到达右下角时,能拾到最多硬币是多少。(只能往前走或往下走,不能往上或回头走);
如果我们用贪心算法,就是看一下前方和下放,哪一块硬币最多,就往哪块走。如果这样走肯定会误导我们,就可能会错过得到最大硬币数量的方案;
如何才能做到每一步走的都是最优的,想做到这一点肯定是要用到动态规划求得最优解;换种说法就是说,我们可以把原来的小矩形状态换为当前状况的最优解,从而可以求得到达任意一个小方块的最优解;
到达任意一个小方块的最优解都已经找到了,结果就很自然出来了!
计算到达某个小方块最优解时,要找到这个解来源于什么地方,找到控制这个解的条件有哪些 。(找到条件)
输入
第一行:N M (1≤N M≤20 0≤Xij≤500(i=1,2„.N, j=1,2„,M)
)表示沙漠是一个N*M的矩形区域
接下来有N行:每行有M个正整数,Xi1 Xi2 ……Xim 表示各位置中的虫子数(单个空格隔开)
假设“KK”只能向右走或向下走。
输出
输出有一个整数, 表示“KK”吃掉最多的虫子数。
样例输入
3 4
3 1 2 8
5 3 4 6
1 0 2 3
样例输出
24
例如:一块N*M的矩形土地被分成N*M个小块,每一小块有不同数量的硬币,如果我从这块土地的左上角出发,到达右下角时,能拾到最多硬币是多少。(只能往前走或往下走,不能往上或回头走);
如果我们用贪心算法,就是看一下前方和下放,哪一块硬币最多,就往哪块走。如果这样走肯定会误导我们,就可能会错过得到最大硬币数量的方案;
如何才能做到每一步走的都是最优的,想做到这一点肯定是要用到动态规划求得最优解;换种说法就是说,我们可以把原来的小矩形状态换为当前状况的最优解,从而可以求得到达任意一个小方块的最优解;
到达任意一个小方块的最优解都已经找到了,结果就很自然出来了!
计算到达某个小方块最优解时,要找到这个解来源于什么地方,找到控制这个解的条件有哪些 。(找到条件)
输入
第一行:N M (1≤N M≤20 0≤Xij≤500(i=1,2„.N, j=1,2„,M)
)表示沙漠是一个N*M的矩形区域
接下来有N行:每行有M个正整数,Xi1 Xi2 ……Xim 表示各位置中的虫子数(单个空格隔开)
假设“KK”只能向右走或向下走。
输出
输出有一个整数, 表示“KK”吃掉最多的虫子数。
样例输入
3 4
3 1 2 8
5 3 4 6
1 0 2 3
样例输出
24
#include<iostream> #include<string.h> using namespace std ; int main() { int a[25][25] , dp[25][25] = {0} ; int i , j ; int n , m ; cin >> n >> m ; for(i = 1 ; i <= n ; i++) for(j = 1 ; j <= m ; j++) cin >> a[i][j] ; i = 1 ; for(j = 1 ; j <= m ; j++) dp[i][j] = dp[i][j-1] + a[i][j] ; j = 1 ; for(i = 1 ; i <= n ; i++) dp[i][j] = dp[i-1][j] + a[i][j] ; for(i = 2 ; i <= n ; i++) for(j = 2 ; j <= m ; j++) if(dp[i-1][j] < dp[i][j-1]) dp[i][j] = dp[i][j-1] + a[i][j] ; else dp[i][j] = dp[i-1][j] + a[i][j] ; cout << dp [m] << endl ; return 0 ; }
相关文章推荐
- Bouguet极线校正进一步理解
- 动态规划和分治法,贪心算法以及递归的再一次深刻理解和体会
- [转]全面理解Unity加载和内存管理机制之二:进一步深入和细节
- 进一步理解!linux下bus,device,driver三者关系
- 进一步理解windows任务管理器
- Retrofit三步理解之二 ------------------ Retrofit的进一步总结
- c++ 关于引用 &的进一步理解
- tensorflow实现MNIST数据集识别---进一步理解
- 对numpy 数组和矩阵的乘法的进一步理解
- NSRunLoop的进一步理解
- C#中委托的进一步理解
- python-58: cookies和opener的进一步理解
- 通过一个WPF实例进一步理解委托和事件
- 对动态规划DP的深入理解
- Bouguet极线校正进一步理解
- NSRunLoop的进一步理解
- 动态规划之01背包问题(最易理解的讲解)
- 『cs231n』卷积神经网络的可视化与进一步理解
- 从01背包问题理解动态规划
- 网关2代码的进一步理解