// 方法一:暴力枚举法(不推荐用于大规模数据) intmaxSubArrayBruteForce(vector<int>& nums) { int n = nums.size(); int maxSum = INT_MIN; for (int i = 0; i < n; i++) { int currentSum = 0; for (int j = i; j < n; j++) { currentSum += nums[j]; maxSum = max(maxSum, currentSum); } } return maxSum; }
// 方法二:动态规划法 intmaxSubArrayDP(vector<int>& nums) { int n = nums.size(); vector<int> dp(n); // dp[i] 表示以nums[i]结尾的最大子数组和 dp[0] = nums[0]; int maxSum = dp[0]; for (int i = 1; i < n; i++) { // 要么将nums[i]加入前面的子数组,要么以nums[i]开始一个新的子数组 dp[i] = max(nums[i], dp[i - 1] + nums[i]); maxSum = max(maxSum, dp[i]); } return maxSum; }
// 方法三:动态规划法(空间优化版) intmaxSubArrayDPOptimized(vector<int>& nums) { int n = nums.size(); int currentSum = nums[0]; int maxSum = nums[0]; for (int i = 1; i < n; i++) { // 要么将nums[i]加入前面的子数组,要么以nums[i]开始一个新的子数组 currentSum = max(nums[i], currentSum + nums[i]); maxSum = max(maxSum, currentSum); } return maxSum; }
intmain() { int n; cin >> n; vector<int> nums(n); for (int i = 0; i < n; i++) { cin >> nums[i]; } // 使用空间优化的动态规划法求解 int result = maxSubArrayDPOptimized(nums); // 如果要使用普通动态规划法,可以取消下面这行的注释,并注释掉上面这行 // int result = maxSubArrayDP(nums); // 如果要使用暴力枚举法,可以取消下面这行的注释,并注释掉上面这行 // int result = maxSubArrayBruteForce(nums); cout << result << endl; return0; }