java实现
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 changcc_
*/
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);
}
}
}
Python实现
def maxSum(l):
if len(l) == 1:
return l[0]
dp = l[:] # dp中最终存储的是以当前字符结尾的最大数字
for i in range(1, len(l)):
if dp[i-1] > 0:
dp[i] = dp[i-1] + l[i] # 前一位置和大于0,加下去,否则另起炉灶
return max(dp)
if __name__ == "__main__":
l = list(map(int, input().split()))
print(maxSum(l))
C++实现
//典型题目,因为是连续子串,因此我们根据当前位置是从头还是连续之前的来区分即可
#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;
}