2
这题最操蛋的是,输入竟然是一个字符串,但是又没有说明。 import java.util.*;
/*
数组的子数组最大和问题
从前向后累加,每累加一个判断是否是新的最大值
若累加值<=0,说明左边的数组对右边的数组继续累加没有意义,则重新开始累加
比如1,2,-4,5,6这样一个数组
累加到1时,最大和为1
累加到2时,最大和为3
累加到-4时,结果为-1,最大和仍为3,但由于左边三个数之和为-1,右边的子序列包括这一段不能使和更大,
因此从5开始重新累加
最终最大子序列和为11
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String inputStr = scanner.next();
String[] inputStrs = inputStr.split(",");
long sum = 0;
long max = 0;
for (String str : inputStrs) {
long num = Integer.parseInt(str);
sum += num;
max = max > sum ? max : sum;
sum = sum < 0 ? 0 : sum;
}
System.out.println(max);
}
}
编辑于 2020-02-17 12:59:50
回复(2)
2
```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Solution17_求连续子数组的最大和 { public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String[] line1 = bf.readLine().split(",");
int[] nums = new int[line1.length];
for (int i = 0; i < line1.length; i++) {
nums[i] = Integer.parseInt(line1[i]);
}
int max = Integer.MIN_VALUE, cur_sum = 0;
for (int i = 0; i < nums.length; i++) {
//如果当前累计的和比0还小,直接抛弃,一个数加上一个负数肯定比原来小,直接取当前数
if (cur_sum <= 0) {
cur_sum = nums[i];
} else {
cur_sum += nums[i];
}
//更新最大值
if (max < cur_sum) {
max = cur_sum;
}
}
System.out.println(max > 0 ? max : 0);
}
}```
发表于 2019-08-05 15:09:34
回复(0)
2
a=input().split(',')
maxm=num=0
for j in a:
num=num+int(j) if num+int(j)>0 else 0#如果当前和非负则保留,为负则舍弃
maxm=max(maxm,num)
print(maxm)
编辑于 2019-12-26 14:02:52
回复(0)
1
比较朴素的做法
#include
#include
using namespace std;
int main(){
string str;
cin >> str;
int k;
vector arr;
while((k = str.find(',')) != str.npos){
string temp = str.substr(0, k);
arr.push_back(stoi(temp));
str = str.substr(k + 1);
}
arr.push_back(stoi(str));
int tempmax = 0;
int realmax = arr[0];
for(int i = 0; i
if(arr[i] <0){
tempmax = arr[i];
}
else{
tempmax += arr[i];
if(tempmax <= 0){
tempmax = arr[i];
}
}
if(tempmax > realmax){
realmax = tempmax;
}
}
if(realmax <= 0){
cout <
}
else{
cout <
}
return 0;
}
编辑于 2020-05-17 12:00:37
回复(0)
1
贪心算法,线性时间复杂度
import java.util.*;
public class Main{
private static Scanner sc;
public static void main(String[] args){
sc = new Scanner(System.in);
while(sc.hasNext()){
int[] nums = readin();
int res = nums[0];
int tmax = nums[0];
for(int i = 1;i
tmax = Math.max(tmax+nums[i],nums[i]);
res = Math.max(res,tmax);
}
if(res > 0)
System.out.println(res);
else
System.out.println(0);
}
}
private static int[] readin(){
String[] in = sc.nextLine().split(",");
int[] res = new int[in.length];
for(int i = 0;i
res[i] = Integer.parseInt(in[i]);
return res;
}
}
发表于 2020-03-04 01:01:49
回复(0)
1
#include
using namespace std;
int main(){
int x;
vector a;
while(cin>>x){
a.push_back(x);
char c = getchar();
if(c=='\n')
break;
}
int Max=0, s = 0;
for(int i=0;i
if(s+a[i]<0)
s = 0;
else{
s += a[i];
Max = max(Max,s);
}
}
cout<
return 0;
}
发表于 2019-11-29 12:43:53
回复(0)
1
动态规划求解:
int max(int n,int *a)
{
int sum=0;
int b=0;
for(int i=1;i《n;i++)
{
if(b》0)
b+=a【i】;
else
b=0;
if(sum《b)
sum=b;
}
if(sum》0)
printf(sum);
else
printf(0);
}
发表于 2019-10-12 20:55:29
回复(0)
1
#include
using namespace std;
int main() {
int ans = 0;
int sum = 0;
int tempValue = 0;
while (~scanf("%d%c",&tempValue))
{
sum += tempValue;
if (sum < 0)
sum = 0;
if (sum > ans)
ans = sum;
}
cout << ans<< endl;
}
发表于 2019-10-04 03:24:42
回复(0)
1
#include
using namespace std;
int main(){
int n,sum,maxsum=0;
vector arr;
arr.reserve(10000);
while(scanf("%d,",&n)>0)
arr.push_back(n);
sum=arr[0];
maxsum=max(sum,maxsum);
for(int i=1;i
if(sum+arr[i]<0)
sum=0;
else{
sum+=arr[i];
maxsum=max(maxsum,sum);
}
cout<
return 0;
}
发表于 2019-09-19 21:08:58
回复(0)
1
"""
最大子段和问题
ans[i]记录以i结尾的最大子段和
"""
import sys
if __name__ == "__main__":
# sys.stdin = open("input.txt", "r")
a = list(map(int, input().strip().split(',')))
ans = [0]
temp = 0
for c in a:
temp = max(0, temp) + c
ans.append(temp)
print(max(ans))
发表于 2019-07-10 12:27:18
回复(0)
1
编辑于 2018-11-08 00:17:06
回复(1)
0
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String inputStr = sc.next();
String[] inputStrs = inputStr.split(",");
long cur = 0;
long maxSum = Integer.MIN_VALUE;
for(String str : inputStrs){
long num = Integer.parseInt(str);
cur = Math.max(cur + num, num);
maxSum = Math.max(maxSum, cur);
}
long res = maxSum > 0 ? maxSum : 0;
System.out.println(res);
}
}
发表于 2020-10-11 17:07:26
回复(0)
0
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
String[] ss = s.split(",");
int[] nums = new int[ss.length];
for(int i = 0; i
nums[i] = Integer.parseInt(ss[i]);
int ans = maxSum(nums);
System.out.println(ans);
}
private static int maxSum(int[] nums){
int max = 0;
int cur = 0;
for(int num : nums){
cur = Math.max(cur,0);
cur += num;
max = Math.max(cur,max);
}
return max > 0 ? max : 0;
}
}
发表于 2020-06-28 00:17:31
回复(0)
0
import sys
in_num = sys.stdin.readline().strip().split(',')
num = [int(i) for i in in_num]
res = []
for length in range(len(num), 0, -1):
for i in range(len(num) - length + 1):
now_num = num[i:i + length]
res.append(sum(now_num))
final_res = max(res)
if final_res
print(0)
else:
print(final_res)
发表于 2020-06-11 17:19:26
回复(0)
0
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
String[] strmun = str.trim().split(",");
// System.out.println(""+Arrays.toString(strmun)+" "+strmun.length);
int[] dp=new int[strmun.length];
int i;
dp[0]=Integer.valueOf(strmun[0]);
for(i=1;i
if(Integer.valueOf(strmun[i])>=(dp[i-1]+Integer.valueOf(strmun[i]))) {
dp[i]=Integer.valueOf(strmun[i]);
}else {
dp[i]=(dp[i-1]+Integer.valueOf(strmun[i]));
}
}
Arrays.sort(dp);
if(dp[i-1]<=0) {
System.out.println("0");
}else {
System.out.println(dp[i-1]);
}
//System.out.println(""+Arrays.toString(dp)+" dp");
}
}
发表于 2020-05-31 10:29:13
回复(0)
0
#include
(720)#include
using namespace std;
int main(void){
string s;
cin>>s;
vector v;
int k;
while ((k = s.find(',')) != s.npos){
string temp = s.substr(0, k);
v.push_back(stol(temp));
s = s.substr(k+1);
}
v.push_back(stol(s));
vector dp(v.size());
long MaxAns = 0;
for (int i = 0; i
if (i == 0)
dp[i] = v[i];
else{
if (dp[i-1] >= 0)
dp[i] = dp[i-1] + v[i];
else
dp[i] = v[i];
}
MaxAns = max(dp[i], MaxAns);
}
cout<
return 0;
}
发表于 2020-05-08 16:02:55
回复(0)
0
测试程序有问题,自测通过但提交未通过 #include
#include
#include
using namespace std;
int main() {
vector vec;
int num;
while (cin >> num) {
vec.push_back(num);
}
vector dp(vec.size(), 0);
dp[0] = vec[0];
for (int i = 1; i < vec.size(); i++) {
dp[i] = max(dp[i - 1] + vec[i], 0);
}
cout << dp[vec.size() - 1] << endl;
return 0;
}
编辑于 2020-04-23 22:57:32
回复(0)
0
O(1) space solution #include
#include
#include
#include
using namespace std;
int main(int argc, char* argv[]){
string str;
cin >> str;
for(int idx = 0; idx < str.length(); idx++){
if(str[idx] == ',') str[idx] = ' ';
}
stringstream ss(str);
int val, sum = 0, largest = 0;
while(ss >> val) {
sum += val;
if(val >= sum){
sum = val;
}
largest = max(largest, sum);
}
cout << largest << endl;
return 0;
}
编辑于 2020-04-10 15:52:44
回复(0)
0
var arr=readline().split(',').map(Number);
var len=arr.length;
var max=0;
// 第一层是窗口大小,第二层是起始索引
for(var i=1;i<=len;i++){
for(var j=0;j<=len-i;j++){
if(i>1){
var tem=arr.slice(j,j+i).reduce((a,b)=>{
return a+b
})
}else{
var tem=arr[j]
}
max=tem>max?tem:max;
}
}
console.log(max)
发表于 2020-04-01 00:03:55
回复(0)
0
// 要注意这两个位置可以是同一个位置,否则只能 AC 83%
public class Main { public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String[] a = in.next().split(",");
System.out.println(ans(a));
}
private static int ans(String[] a) {
int n = a.length;
if(n==1) {
return a[0].startsWith("-") ? 0 : Integer.parseInt(a[0]);
}
int res = 0;
int dp[][] = new int[n][n];
for(int i=0;i
for(int j=i;j
int sum = 0;
if(i==j) {
sum = Integer.parseInt(a[i]);
} else if(i==j-1) {
sum = Integer.parseInt(a[i]) + Integer.parseInt(a[j]);
} else {
sum = dp[i][j-1] + Integer.parseInt(a[j]);
}
res = Math.max(res, sum);
dp[i][j] = sum;
}
}
return (res>0) ? res : 0;
}
}
发表于 2020-03-16 23:23:52
回复(0)