找硬幣問題
阿新 • • 發佈:2019-02-17
有一個機器人 在(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; }