程式設計題:動態規劃---從左上角到右下角的價值最大的路徑
阿新 • • 發佈:2018-12-24
騰訊2016年4月2號暑假實習移動開發崗的筆試題,程式設計題第一題大概題目是:
一個m*n的矩陣,只能向右走或是向下走,矩陣每一個元素代表一個財富值,要求打印出從左上角到右下角走的財富最大總值。
如輸入m=4 ,n=5,
輸入矩陣value=
{ 0 0 7 0 0,
0 0 0 5 0,
2 0 4 0 0,
0 0 0 3 0},
打印出最大財富總值是15。
這是動態規劃的題目,跟“[leetcode 64] Minimum Path Sum------從左上角到右下角的最小路徑值”的思路是一樣的,
C++的參考程式碼如下:
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int value[1024][1024]; int main() { int m, n; scanf_s("%d%d", &m, &n); //輸入矩陣 for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { scanf_s("%d", &value[i][j]); } } //計算 for (int i = 1; i < m; ++i) { value[i][0] += value[i - 1][0]; } for (int j = 1; j < n; ++j) { value[0][j] += value[0][j - 1]; } for (int i = 1; i < m; ++i) { for (int j = 1; j < n; ++j) { value[i][j] += max(value[i - 1][j], value[i][j - 1]); } } ////列印除錯 //for (int i = 0; i < m; ++i) //{ // for (int j = 0; j < n; ++j) // { // cout << value[i][j] << " "; // } // cout << endl; //} //cout << endl; cout << value[m - 1][n - 1] << endl; return 0; }
程式執行結果: