给一个长度为N的序列a1,a2,...,an,求最大连续和。也即,寻找1<=i<=j<=N,使得ai+...+aj尽量大。
#include <iostream> #include <limits.h> using namespace std; int main(){ int cur = 0, ans = INT_MIN, cursum = 0; char c='0'; do{ while(c == ' '){ c = getchar(); } cin >> cur; cursum += cur; ans = max(ans, cursum); if(cursum < 0){ cursum = 0; } c = getchar(); }while(c != '\n'); cout << ans << endl; return 0; }
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().trim().split(","); int[] arr = new int[strArr.length]; for(int i = 0; i < arr.length; i++) arr[i] = Integer.parseInt(strArr[i].trim()); int[] dp = new int[arr.length]; dp[0] = arr[0]; int max = dp[0]; for(int i = 1; i < arr.length; i++){ dp[i] = Math.max(dp[i - 1] + arr[i], arr[i]); max = Math.max(max, dp[i]); } System.out.println(max); } }
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] arrS = br.readLine().trim().split(","); int[] arr = new int[arrS.length]; int max = Integer.parseInt(arrS[0].trim()); for (int j = 0; j < arrS.length; j++) { arr[j] = Integer.parseInt(arrS[j].trim()); if (arr[j] > max) { max = arr[j]; } } int total = 0; for (int j : arr) { total += j; if (total < 0) { total = 0; } else if (total > max) { max = total; } } System.out.println(max); } }
#include <bits/stdc++.h> using namespace std; int main() { int x, ans = INT_MIN, sum = 0; char c = '0'; do { while(c == ' '){ c = getchar(); } cin >> x; sum += x; ans = max(ans, sum); if (sum < 0) { sum = 0; } c = getchar(); }while(c != '\n'); cout << ans << endl; return 0; }滑动窗口
A=list(map(int,input().strip().split(','))) dp=[0]*len(A) dp[0]=A[0] barray=dp[0] #存储边界最大 for i in range(1,len(A)): pre=dp[i-1] after=sum(A[0:i+1]) if barray+A[i]>A[i]: barray=barray+A[i] else: barray=A[i] after2=barray if pre>after and pre>after2: #A[0...i]最大 dp[i]=pre elif after>pre and after>after2: #A[0...i i+1]最大 dp[i]=after else: #A[..x..i+1]最大 dp[i]=after2 print(dp[-1])
#include <bits/stdc++.h> #define N 10000005 #define f( i, a ,b) for(int i=(a);i<=(b);i++) #define inf 1<<30 #define llo long long using namespace std; llo a[N],p,b[N],ans=-inf;int n=1; int main() { while (scanf("%lld",&a[n])!=EOF) { n++; char ch=getchar(); if (ch!=','&&ch!=' ') break ; }n--; f(i,1,n) a[i]+=a[i-1]; f(i,1,n) b[i]=p,p=min(p,a[i]); f(i,1,n) ans=max( ans,a[i]-b[i]); printf("%lld",ans); return 0; }事实上困扰我的还是读入问题 因为没给n的值也没结束符号不知道怎么处理。