给定一个长度为
的数组,数组中的数为整数。
请你选择一个非空连续子数组,使该子数组所有数之和尽可能大。求这个最大值。
第一行为一个正整数,代表数组的长度。
第二行为个整数
,用空格隔开,代表数组中的每一个数。
连续子数组的最大之和。
3 3 -4 5
5
选择 [5] 这个子数组即可。
3 4 -3 5
6
选择 [4,-3,5] 这个子数组。
Erlang人生动态规划
解题思路
如果到目前为止你的过去是负担,那就放下吧,每天都是新的开始~
如果到目前为止你的过去是正担,那就带上吧,试试找到自己人生的最大子序和吧~(即自己相对提升最大的一段时间,我希望是现在也是未来)
代码
-spec max_sub_array(Nums :: [integer()]) -> integer().
max_sub_array(Nums = [NumH | NumsT]) ->
do_max_sub_array(NumsT, #{nums => [NumH]}).
do_max_sub_array([Num | T], Args = #{nums := Nums = [PreSum | _]}) ->
Sum = case PreSum >= 0 of
true ->
Num + PreSum;
_ ->
Num
end,
do_max_sub_array(T, Args#{nums := [Sum | Nums]});
do_max_sub_array([], _Args = #{nums := Nums}) ->
lists:max(Nums).
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> v;
for (int i = 0; i < n; ++i) {
int a;
cin >> a;
v.push_back(a);
}
vector<int> dp(n);
dp[0] = v[0];
for (int i = 1; i < n; ++i) {
dp[i] = max(dp[i - 1] + v[i], v[i]);
}
int res = dp[0];
for (int i = 0; i < n; ++i) {
res = max(dp[i], res);
}
cout << res;
return 0;
} #include <iostream>
using namespace std;
int main()
{
int a[200005], n, dp[200005];
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
dp[0] = a[0];
int res = dp[0];//这里注意赋值初始化不能为0,如果只有一个元素,可能导致进不去循环,最后输出res没有值哦
for (int i = 1; i < n; i++)
{
dp[i] = max(dp[i - 1] + a[i], a[i]); // 如果遇到a[i]<0
res = max(res, dp[i]);
}
cout << res;
} #include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int arr[n], dp[n];
for (int i = 0; i < n; ++i) cin >> arr[i];
// 时间复杂度O(N),空间复杂度O(1)
int dp0 = arr[0], dp1, res = arr[0];
for (int i = 1; i < n; ++i) {
// i位置处最大子数组和,一定包含i-1位置的数,这样才能保证连续
dp1 = max(dp0 + arr[i], arr[i]);
res = res > dp1 ? res : dp1;
dp0 = dp1;
}
cout << res;
return 0;
} import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
int n = in.nextInt();
int [] nums = new int[n];
for (int i = 0; i < n; i++)
nums[i] = in.nextInt();
int res = maxSubArray(nums);
System.out.println(res);
}
static int maxSubArray(int[] nums) {
int res = nums[0];
for (int i = 1; i < nums.length; i++) {
nums[i] += Math.max(nums[i - 1], 0);
res = Math.max(res, nums[i]);
}
return res;
}
} #include <stdio.h>
int main() {
int n,max;
scanf("%d",&n);
int a[n],dp[n];
for (int i=0; i<n; i++) {
scanf("%d",&a[i]);
}
dp[0]=a[0];
max=dp[0];
for (int i=1; i<n; i++) {
dp[i]=(a[i]>(dp[i-1]+a[i])?a[i]:(dp[i-1]+a[i]));
max=(dp[i]>max?dp[i]:max);
}
printf("%d", max);
return 0;
} #include <iostream>
using namespace std;
int main() {
int n, res = 0, sum=0;
cin>>n;
int x;
cin>>x;
res = x; sum = x;
while(--n){
cin>>x;
if(sum>0){
res = max(res, sum);
sum += x;
}else{
sum = x;
res = max(res,sum);
}
}
res = max(res,sum);
cout<<res;
}
// 64 位输出请用 printf("%lld") # 解法一 _ = input() arr = list(map(int, input().split())) # 初始化s为从第一个元素前开始连续相加的值 s = 0 # 初始化res为第一个元素的值 res = arr[0] # 遍历数组 for i in arr: # 更新s s += i # 如果更新后的s比res大,则赋值给res res = max(s, res) # 如果更新后的s小于0,则清空值,从下一个元素开始更新 s = max(s, 0) # 最后res即为连续子数组的最大值 print(res) # 解法二 n = int(input()) arr = list(map(int, input().split())) dp = [arr[0]] # 遍历数组 for i in range(1, n): # 连加后的值与下一个值作比较,如果连加后比较大,则不取下一个值;如果下一个值比较大,则从下一个值算起 dp.append(max(arr[i], dp[i - 1] + arr[i])) print(max(dp))
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int[] a = new int[num];
for (int i = 0; i < num; i++) {
a[i] = sc.nextInt();
}
int sum = 0;
int max = getMaxPlus(sum, a);
System.out.println(max);
}
private static int getMaxPlus(int sum, int[] a) {
if (a.length == 1) return a[0];
int[] dp = new int[a.length];
dp[0] = a[0];
if (dp[0] > 0) sum += dp[0];
for (int i = 1; i < a.length; i++) {
sum += a[i];
sum = Math.max(sum, a[i]);
dp[i] = Math.max(sum, dp[i - 1]);
}
System.out.println(Arrays.toString(dp));
return dp[a.length - 1];
} import sys nums = [] for line in sys.stdin: a = line.split() nums = a m = len(nums) # 定义dp[i]为选中第i元素的子数据最大值 # 输出为max(dp[1],...,dp[m]) # dp方程:dp[i+1] = max(dp[i] + nums[i], nums[i]) dp = [0] * (m+1) max_res = -9999 for i in range(m): dp[i+1] = max(dp[i] + int(nums[i]), int(nums[i])) max_res = max(max_res, dp[i+1]) print(max_res)
#include <iostream>
using namespace std;
const int N = 200010;
int a[N];
int main()
{
int n;
cin >> n;
for(int i = 0; i < n; i++)
cin >> a[i];
int ret = -101, sum = -101;
for(int i = 0; i < n; i++)
{
sum = max(sum + a[i], a[i]);
ret = max(ret, sum);
}
cout << ret << endl;
}
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function () {
let n=await readline();
let arr=(await readline()).split(" ").map(it=>parseInt(it));
let max=arr[0],sum=0;
for(let i=0;i<arr.length;i++){
sum+=arr[i];
if(arr[i]>sum) sum=arr[i];
if(sum>max) max=sum;
}
console.log(max);
}()