找硬币问题
来源:互联网 发布:肿瘤的临床数据分析 编辑:程序博客网 时间:2024/06/02 03:03
有一个机器人 在(1,1)位置,在m*n的木板上放着硬币,1代表有,0代表无,机器人只能向下或者向右走,求能收集到的最大硬币。
利用动态规划,在第一行和第1列每个位置上的最大值,为每个位置上是否有硬币,从(2,2)元素开始,这个位置上的最大值,为上一个位置,也就是左边或者是上边的值传递过来,因此只要求得两者的最大值再加这个位置上是否有值即可,最后只要输出最右下角的元素值,即为收到的最多硬币值 算法复杂度为O(m*n)
#include<iostream>using namespace std;int main() { //行数与列数 每个位置上是否有硬币 按照逐行的方法 用动态规划求得最值 int m,n,a[100][100],f[100][100]; cout<<"请输入行数与列数"<<endl; cin>>m>>n; cout<<"请输入每个位置上是否有硬币,0代表无,1代表有"<<endl; for(int i = 0; i < m ;i++) for(int j = 0; j < n; j++) cin>>a[i][j]; //初始化行列 第0行和第1行为输入的值 for(int i = 0; i < n; i++) f[0][i] = a[0][i]; for(int i = 0; i < m; i++) f[i][0] = a[i][0]; //由动态规划求值 for(int i = 1; i < m; i++) { for(int j = 1; j < n;j++){ /*现在这个方位的值有可能是由上方的值来的,也有可能是由左边的值过来的 因此分为两种情况,求两种情况里面最大的一种可能性即可*/ int temp = max(f[i-1][j],f[i-1][j] + a[i][j]); int temp1 = max(f[i][j-1],f[i][j-1] + a[i][j]); f[i][j] = max(temp, temp1); } } //输出最后一个 即为最大的 cout <<f[m-1][n-1]; return 0;}
0 0
- 找硬币问题
- 找硬币问题
- 找换硬币问题
- 找硬币问题
- 找硬币问题
- 最少找硬币问题
- C++典型贪心算法--找硬币问题
- 面试:称硬币找假币的问题
- 找硬币
- 分治算法思想解决找假硬币的问题
- 贪心算法-找硬币
- bzoj3233 [Ahoi2013]找硬币
- 【算法题】找硬币
- DFS 找硬币
- 3233: [Ahoi2013]找硬币
- 【DP】【cofun1900】找硬币
- 硬币问题
- 硬币问题
- 适配器模式 个人理解+JAVA 小例子
- 进程的阻塞和挂起的区别
- Android ADT——快速更新API
- Redis的基本操作二
- 第一天
- 找硬币问题
- MapReduce YARN Memory Parameters
- C++第六次实验-矩阵求和
- CodeForces - 672C Recycling Bottles (贪心)
- OpenWRT编译用于高通AR9561(2)
- android:ListView下拉刷新上拉加载(SwipeRefreshLayout+滑动监听加载更多)
- 使用 stylelint找出你的CSS样式表里的错误和问题
- Java数据类型转换(自动转换和强制转换)
- Linux内核移植