做网站的品牌公司有哪些/百度手机关键词排名工具
题目地址:
https://www.acwing.com/problem/content/56/
在一个m×nm×nm×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于000)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物?
注意:
m,n>0m,n>0m,n>0
m×n≤1350m×n≤1350m×n≤1350
设f[i][j]f[i][j]f[i][j]是从(0,0)(0,0)(0,0)走到(i,j)(i, j)(i,j)最多拿到的价值,则f[i][j]=max{f[i−1][j],f[i][j−1]}+A[i][j]f[i][j]=\max\{f[i-1][j], f[i][j-1]\}+A[i][j]f[i][j]=max{f[i−1][j],f[i][j−1]}+A[i][j],返回f[m−1][n−1]f[m-1][n-1]f[m−1][n−1]。可以用滚动数组优化空间。代码如下:
#include <vector>
#include <iostream>
using namespace std;class Solution {
public:int getMaxValue(vector<vector<int>>& grid) {int n = grid[0].size();vector<int> f(grid[0].begin(), grid[0].end());for (int j = 1; j < n; j++) f[j] += f[j - 1];for (int i = 1; i < grid.size(); i++)for (int j = 0; j < n; j++)if (!j) f[j] += grid[i][j];else f[j] = grid[i][j] + max(f[j], f[j - 1]);return f[n - 1];}
};
时间复杂度O(mn)O(mn)O(mn),空间O(n)O(n)O(n)。