如果我们知道了以每个位置结尾的子数组的最大累加和,里面最大的那个结果就是整个数组的子数组的最大累加和了。
例:
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