你可以通过使用动态规划来优化这段代码。具体步骤如下:

  1. 定义一个数组dp,dp[i]表示以第i个数结尾的子数组的最大和。
  2. 初始化dp数组,将dp[1]设置为a[1]。
  3. 遍历数组a,从第2个数开始,对于每个数a[i],计算dp[i] = max(a[i], dp[i-1]+a[i])。
  4. 遍历dp数组,找到最大值,即为所求的最大子数组和。

下面是优化后的代码:

#include<bits/stdc++.h> using namespace std; long int a[100001], dp[100001]; int main(){ long int sb, bs; cin>>sb>>bs; for(int i=1; i<=sb; i++){ scanf("%d",a+i); } dp[1] = a[1]; // 初始化dp数组 for(int i=2; i<=sb; i++){ dp[i] = max(a[i], dp[i-1]+a[i]); // 动态规划计算dp数组 } long int cnm = dp[bs]; for(int i=bs+1; i<=sb; i++){ cnm = max(cnm, dp[i]); // 找到最大子数组和 } printf("%d",cnm); return 0;

#includebitsstdc++husing namespace std;long int a100001b100001iiismdnmcnmfuk;long int sbbs;int main cinsbbs; fori=1;i=sb;i++ 	scanfda+i+1; fori=bs;i=sb;i++fuk++ 	forii=fuk;ii=i;ii++

原文地址: https://www.cveoy.top/t/topic/h31y 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录