找硬币问题

有一个机器人 在(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;
}



你可能感兴趣的:(找硬币问题)