1. 程式人生 > >程式設計題:動態規劃---從左上角到右下角的價值最大的路徑

程式設計題:動態規劃---從左上角到右下角的價值最大的路徑

騰訊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;
}

程式執行結果: