import java.util.Scanner; /** * Dynamic Programming * * State: * dp[i]: 以a[i]为结尾的连续子串的最大和 * * Initial State: * dp[0] = a[0] * * State Transition: * if (dp[i - 1] >= 0) dp[i] = dp[i - 1] + a[i]; * else dp[i] = a[i]; * * @author wylu */ public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { String[] strs = scanner.nextLine().split(" "); int[] a = new int[strs.length]; for (int i = 0; i < strs.length; i++) { a[i] = Integer.valueOf(strs[i]); } int[] dp = new int[a.length]; dp[0] = a[0]; int res = dp[0]; for (int i = 1; i < a.length; i++) { dp[i] = (dp[i - 1] >= 0) ? dp[i - 1] + a[i] : a[i]; res = Math.max(res, dp[i]); } System.out.println(res); } } }
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] strArr = br.readLine().split(" "); if(strArr.length == 0){ System.out.println(0); }else if(strArr.length == 1){ System.out.println(Integer.parseInt(strArr[0])); }else{ int[] arr = new int[strArr.length]; for(int i = 0; i < arr.length; i++) arr[i] = Integer.parseInt(strArr[i]); int maxSum = arr[0]; int dp = arr[0]; for(int i = 1; i < arr.length; i++){ dp = dp < 0? arr[i]: dp + arr[i]; maxSum = Math.max(maxSum, dp); } System.out.println(maxSum); } } }
a = input().split() a = [int(a[i]) for i in range(len(a))] def max_subsequence(arr): length = len(arr) if length == 0: return 0 if length == 1: return arr[0] sum_tmp = arr[0] sum_max = arr[0] for i in range(1, length): sum_tmp = max(sum_tmp + arr[i], arr[i]) if sum_max < sum_tmp: sum_max = sum_tmp return sum_max print(max_subsequence(a))
#include<cstdio> int max3(int a, int b, int c) { if (a < b) a = b; if (a < c) return c; else return a; } int maxSubSum (int a[], int left, int right) { if (left == right) return a[left]; int i, mid; int maxLeftSum, maxRightSum; int maxMidSum1, maxMidSum2, sumer1, sumer2; // 求左、右子表最大子序列 mid = (left + right) / 2; maxLeftSum = maxSubSum(a, left, mid); maxRightSum = maxSubSum(a, mid+1, right); // 求跨左右子表的最大子序列 for (i = mid; i >= left; --i) { if (i == mid) { maxMidSum1 = sumer1 = a[i]; } else { sumer1 += a[i]; if (maxMidSum1 < sumer1) maxMidSum1 = sumer1; } } for (i = mid+1; i <= right; ++i) { if (i == mid+1) { maxMidSum2 = sumer2 = a[i]; } else { sumer2 += a[i]; if (maxMidSum2 < sumer2) maxMidSum2 = sumer2; } } return max3(maxLeftSum, maxRightSum, maxMidSum1+maxMidSum2); } int main () { int a[100]; int n = 0; while (scanf("%d", &a[n++]) != EOF) ; printf("%d", maxSubSum(a, 0, n-2)); return 0; }算法分析:
#include<cstdio> #include<vector> using namespace std; int main () { int tmp; vector<int> vec; while (scanf("%d", &tmp) != EOF) vec.push_back(tmp); // 算法逻辑 int i, thisSum = 0, maxSum = vec[0]; for (i = 0; i < vec.size(); ++i) { thisSum += vec[i]; if (maxSum < thisSum) maxSum = thisSum; if (thisSum < 0) thisSum = 0; } printf("%d", maxSum); return 0; }
#include <bits/stdc++.h> using namespace std; int main() { int z, _max; vector<int> vi; while (cin >> z)vi.push_back(z); int * dp = new int[vi.size()]; dp[0] = vi[0]; _max = dp[0]; for (int i = 1; i < vi.size(); i++) { dp[i] = max(dp[i - 1] + vi[i], vi[i]); if (dp[i] > _max)_max = dp[i]; } cout << _max; }
while True: try: m = list(map(int,input().split())) sum = 0 max = m[0] for i in m: if sum >= 0: sum += i else: sum = i if sum > max: max = sum print(max) except: break
//典型题目,因为是连续子串,因此我们根据当前位置是从头还是连续之前的来区分即可 #include <iostream> #include <vector> #include <limits.h> using namespace std; int main(){ vector<int> vec; int num; while(cin>>num) vec.push_back(num); int res=INT_MIN,cur=0; for(int i=0;i<vec.size();++i){ cur=max(cur+vec[i],vec[i]); //进行当前位置是否连续的讨论 res=max(res,cur); } cout<<res; return 0; }
#include<bits/stdc++.h> using namespace std; int main() { vector<int> vec; int a; while(cin>>a) { vec.push_back(a); if(cin.get() == '\n') break; } int size = vec.size(); int max = vec[0], cursum = vec[0]; for(int i = 1; i < size; i++){ cursum = cursum + vec[i] > vec[i] ? cursum + vec[i] : vec[i]; max = cursum > max ? cursum : max; } cout<<max<<endl; return 0; }
#include<iostream> using namespace std; #include<vector> #include<algorithm> int FindGreatestSumOfSubArray(vector<int> array) { int len = array.size(); if(len == 0) return 0; //如果数组长度为0,返回0 if(len == 1) return array.front(); //如果数组长度为1,返回唯一的元素 vector<int> sum; //存储数组每次累加的和值 int max; //最大的那个和值 int i,j; for(i = 0; i < len-1; i++) //i从0到倒数第二位置 { sum.push_back(array[i]); //将数组首元素赋值给sum for(j = i+1; j < len; j++) sum.push_back(sum.back() + array[j]); //将sum的最后一个元素和下一个数组元素进行相加,并插入到sum最后 } sort(sum.begin(),sum.end()); //对每轮得到的和值进行排序,然后找到该轮的和的最大值 max = sum.back(); return max; } int main(void) { vector<int> data; int swp; while(cin>>swp) data.push_back(swp); cout<<FindGreatestSumOfSubArray(data); return 0; }