DD1. 连续最大和
描述
一个数组有 N 个元素,求连续子数组的最大和。 例如:[-1,2,1],和最大的连续子数组为[2,1],其和为 3输入描述
输入为两行。 第一行一个整数n(1 <= n <= 100000),表示一共有n个元素 第二行为n个数,即每个元素,每个整数都在32位int范围内。以空格分隔。输出描述
所有连续子数组中和最大的值。示例1
输入:
3 -1 2 1
输出:
3
C++ 解法, 执行用时: 3ms, 内存消耗: 256KB, 提交时间: 2017-06-13
#include<iostream> using namespace std; int main(){ int n,*a; while(cin>>n){ a = new int[n]; for(int i=0;i<n;i++){ cin>>a[i]; } int sum=a[0],max=a[0]; for(int i=1;i<n;i++){ sum = sum>0? (sum+a[i]): a[i]; if(sum>max){ max = sum; } } cout<<max<<endl; } return 0; }
C++ 解法, 执行用时: 3ms, 内存消耗: 376KB, 提交时间: 2017-06-10
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main(){ int n; cin >> n; vector<int> v; for (int i = 0; i < n; ++i) { int temp; cin >> temp; v.push_back(temp); } if (v.size()==1) { cout << v[0] << endl; return 0; } vector<int> d(v.size(), 0); d[0]=v[0]; for (int i = 1; i < v.size();++i) { d[i] = max(d[i - 1] + v[i], v[i]); } int res = d[0]; for (int i = 1; i < d.size();++i) { if (res<d[i]) { res = d[i]; } } cout << res << endl; return 0; }
C++ 解法, 执行用时: 6ms, 内存消耗: 1944KB, 提交时间: 2021-11-14
#include <bits/stdc++.h> using namespace std; template <typename T> inline void read(T &f) { f=0;T fu=1;char c=getchar(); while(c<'0'||c>'9') {if(c=='-'){fu=-1;}c=getchar();} while(c>='0'&&c<='9') {f=(f<<3)+(f<<1)+(c&15);c=getchar();} f*=fu; } template <typename T> void print(T x) { if(x<0) putchar('-'),x=-x; if(x<10) putchar(x+48); else print(x/10),putchar(x%10+48); } template <typename T> void print(T x, char t) { print(x);putchar(t); } typedef long long ll; const ll inf=0x3f3f3f3f3f3f3f3f; const int maxn=1e5+50; ll a[maxn],n,b[maxn]; ll maxx=-inf,minn=inf; void solve() { read(n); for(int i=1;i<=n;++i) read(a[i]),b[i]=a[i]; for(int i=1;i<=n;++i) a[i]=a[i]+a[i-1]; int pos; for(int i=1;i<=n;++i) { if(a[i]>=maxx) { maxx=a[i]; pos=i; } } for(int i=0;i<pos;++i) { if(a[i]<minn) { minn=a[i]; } } ll ans=maxx-minn; for(int i=1;i<=n;++i) if(b[i]>ans) ans=b[i]; print(ans); } int main() { #ifdef AC freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif clock_t program_start_clock=clock(); solve(); #ifdef NO_TLE fprintf(stderr,"\nTotal Time: %lf ms",double(clock()-program_start_clock)/(CLOCKS_PER_SEC/1000)); #endif return 0; }
Go 解法, 执行用时: 6ms, 内存消耗: 4964KB, 提交时间: 2020-12-25
package main import ( "bufio" "fmt" "math" "os" "strconv" "strings" ) func main() { reader := bufio.NewReader(os.Stdin) // 读一行,去掉最后的换行后按照空格分割 str, _ := reader.ReadString('\n') str = str[:len(str)-1] strs := strings.Split(str, " ") // 将strs中的字符串转为整数后传入 n, _ := strconv.Atoi(strs[0]) str, _ = reader.ReadString('\n') str = str[:len(str)-1] strs = strings.Split(str, " ") arr := make([]int, n) for i := 0; i < n; i++ { arr[i], _ = strconv.Atoi(strs[i]) } fmt.Println(maxSum(arr)) } func maxSum(arr []int) int { res := math.MinInt32 sum := 0 for _, v := range arr { if sum < 0 { sum = 0 } sum += v if res < sum { res = sum } } return res }
Rust 解法, 执行用时: 7ms, 内存消耗: 1684KB, 提交时间: 2022-05-02
use std::io; fn main() -> Result<(), Box<dyn std::error::Error>> { let mut input = String::new(); io::stdin().read_line(&mut input); let n = input.trim().parse::<usize>()?; input.clear(); io::stdin().read_line(&mut input); let nums = input.trim().split_ascii_whitespace() .map(|num| num.parse::<i32>().unwrap()) .collect::<Vec<i32>>(); let mut dp = vec![0; n]; dp[0] = nums[0]; for i in 1..n { dp[i] = nums[i].max(dp[i-1] + nums[i]); } print!("{}", *dp.iter().max().unwrap()); Ok(()) }