剑指 Offer 42. 第 9 天 动态规划(中等)
剑指 Offer 42. 连续子数组的最大和
题目思路
不断用一个变量进行求和,如果求和结果小于0的话则等于当前元素,否则加上当前元素,求该变量的最大值
代码
c++代码
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int n = nums.size();
int sum=0;
int ans=-1000000;
for(int i=0;i<n;i++){
if(sum<0){
sum=nums[i];
}else{
sum+=nums[i];
}
ans=max(ans,sum);
}
return ans;
}
};
python代码
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
n = len(nums)
s = 0
ans = -1000000
for i in range(n):
if s<0 :
s = nums[i]
else :
s = s + nums[i];
ans=max(ans,s)
return ans
剑指 Offer 47. 礼物的最大价值
题目思路
很明显结果是从上一个和左边那个推过来的,选取最大值
代码
c++代码
class Solution {
public:
int maxValue(vector<vector<int>>& grid) {
if(!grid.size()||!grid[0].size())return 0;
int a[210][210]={
0};
int n = grid.size();
int m = grid[0].size();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
a[i][j]=max(a[i-1][j],a[i][j-1]);
a[i][j]+=grid[i-1][j-1];
}
}
return a[n][m];
}
};
python代码
class Solution:
def maxValue(self, grid: List[List[int]]) -> int:
if grid==None or grid[0]==None :
return 0
n =len(grid)
m = len(grid[0])
a = [[0]*210]*210
for i in range(1,n+1):
for j in range(1,m+1):
a[i][j] = max(a[i-1][j],a[i][j-1])
a[i][j] = a[i][j] + grid[i-1][j-1]
return a[n][m]
这篇文章如果对小伙伴们有帮助的话,希望点个赞支持一下~ 十分感谢~