给定一个长度为
的数组,数组中的数为整数。
请你选择一个非空连续子数组,使该子数组所有数之和尽可能大。求这个最大值。
第一行为一个正整数,代表数组的长度。
第二行为个整数
,用空格隔开,代表数组中的每一个数。
连续子数组的最大之和。
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; } }
n = int(input()) a=list(map(int,input().split())) dp=[0 for _ in range(n)] for i in range(n): dp[i]=max(a[i],dp[i-1]+a[i]) print(max(dp))
#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); }()