一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下向右走,求能够获得的最大价值。
例如:3 * 3的方格。
1 3 3
2 1 3
2 2 1
能够获得的最大价值为:11。
Input
第1行:N,N为矩阵的大小。(2 <= N <= 500) 第2 - N + 1行:每行N个数,中间用空格隔开,对应格子中奖励的价值。(1 <= N[i] <= 10000)
OutPut
输出能够获得的最大价值。
Input示例
3 1 3 3 2 1 3 2 2 1
Output示例
11
状态转移方程:f(i,j) = max{f(i+1,j),f(i,j+1)|i<N,j<N}+A[i][j];
代码如下:
#include <vector>
#include <iostream>
using namespace std;
int main()
{
int n;
cin>>n;
vector<vector<int>> data(n,vector<int>(n,0));
int value;
for(int i=0;i<n;++i){
for(int j=0;j<n;++j){
cin>>value;
data[i][j] = value;
}
}
vector<vector<int>> dp(n+1,vector<int>(n+1,0));
for(int i=n-1;i>=0;--i){
for(int j=n-1;j>=0;--j){
dp[i][j] = (i==n-1 ? 0:dp[i+1][j]);
dp[i][j] = dp[i][j]>dp[i][j+1]? dp[i][j]:dp[i][j+1];
dp[i][j] += data[i][j];
}
}
cout<<dp[0][0]<<endl;
return 0;
}