如果我们知道了以每个位置结尾的子数组的最大累加和,里面最大的那个结果就是整个数组的子数组的最大累加和了。
例:
arr = [1, -2, 3, 5, -2, 6, -1]
dp = [1, -1, 3, 8, 6, 12, 11]
所以arr数组中子数组的最大累加和为12。
设数组dp中,dp[i]表示以i位置结尾的最大累加和。
我们如何求出dp数组?
- 只选arr[i]
- 选arr[i]加上以i-1位置结尾的子数组的最大累加和
即:dp[i] = max(arr[i],dp[i-1]+arr[i])
c++
class Solution {
public:
int maxsumofSubarray(vector<int>& arr) {
int len = arr.size();
vector<int> dp(len,0);
dp[0] = arr[0];
int res = arr[0];
for(int i = 1 ; i < len; ++i){
dp[i] = max(dp[i - 1] + arr[i],arr[i]);
res = max(res,dp[i]);
}
return res;
}
};java
import java.util.*;
public class Solution {
public int maxsumofSubarray (int[] arr) {
int len = arr.length;
int dp[] = new int[len];
dp[0] = arr[0];
int res = arr[0];
for(int i = 1 ; i < len; ++i){
dp[i] = Math.max(dp[i - 1] + arr[i],arr[i]);
res = Math.max(res,dp[i]);
}
return res;
}
}python
class Solution:
def maxsumofSubarray(self , arr ):
dp = [0]*len(arr)
dp[0] = arr[0]
res = arr[0]
for i in range(1,len(arr)):
dp[i] = max(dp[i - 1] + arr[i],arr[i]);
res = max(res,dp[i]);
return res;我们观察过程可以发现,其实并不用开一整个dp数组,因为我们每次用到的只是dp[i-1].所以拿一个变量存一下也能达到这样的效果。
c++
class Solution {
public:
int maxsumofSubarray(vector<int>& arr) {
int len = arr.size();
int dp = arr[0];
int res = arr[0];
for(int i = 1 ; i < len; ++i){
dp = max(dp + arr[i],arr[i])
res = max(res,dp)
}
return res
}
};java
import java.util.*;
public class Solution {
public int maxsumofSubarray (int[] arr) {
int len = arr.length;
int dp = arr[0];
int res = arr[0];
for(int i = 1 ; i < len; ++i){
dp = Math.max(dp + arr[i],arr[i]);
res = Math.max(res,dp);
}
return res;
}
}python
class Solution:
def maxsumofSubarray(self , arr ):
# write code here
dp = [0]*len(arr)
dp = arr[0]
res = arr[0]
for i in range(1,len(arr)):
dp = max(dp + arr[i],arr[i])
res = max(res,dp)
return res
京公网安备 11010502036488号