C 子阵中的最大和
您将得到一个由N个整数组成的数组。C 子阵中的最大和,c,max,sub-array,C,Max,Sub Array,您将得到一个由N个整数组成的数组。 数组的最大和是该数组的非空连续子数组元素的最大和。 例如,数组[1,-2,3,-2,5]的最大和是6,因为子数组[3,-2,5]的和是6,并且不可能实现更大的子数组和。 现在,您可以从给定数组中删除最多一个元素。通过这样做,您可以获得的结果数组的最大可能和是多少 我正在用我自己的测试用例测试我的代码。我在dev-c++上获得了正确的输出。 但当我在线测试代码时,我得到了错误的答案。我无法找出问题所在 #include <stdio.h> #incl
数组的最大和是该数组的非空连续子数组元素的最大和。
例如,数组[1,-2,3,-2,5]的最大和是6,因为子数组[3,-2,5]的和是6,并且不可能实现更大的子数组和。
现在,您可以从给定数组中删除最多一个元素。通过这样做,您可以获得的结果数组的最大可能和是多少 我正在用我自己的测试用例测试我的代码。我在dev-c++上获得了正确的输出。 但当我在线测试代码时,我得到了错误的答案。我无法找出问题所在
#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
struct result{
long long int start;
long long int end;
long long int sum;
}res;
long long int find_max(long long int a[],long long int n)
{
long long int max=LLONG_MIN;
long long int i;
for(i=0;i<n;++i)
{
if(a[i]>max)
max=a[i];
}
return max;
}
long long int max_sub(long long int a[],long long int n)
{
long long int i;
long long int min,sum1=0;
struct result max,max_curr,*maxsub;
maxsub=calloc(sizeof(res),n);
max.sum=LLONG_MIN;
max_curr=max;
for(i=0;i<n;++i)
{
if(max_curr.sum<0)
{
max_curr.sum=a[i];
max_curr.start=i;
max_curr.end=i;
}
else
{
max_curr.sum+=a[i];
max_curr.end=i;
}
if(max_curr.sum>max.sum)
{
max=max_curr;
}
maxsub[i]=max;
}
min=0;
for(i=maxsub[n-1].start;i<=maxsub[n-1].end;++i)
{
if(a[i]<0)
{
if(min==0 || a[i]<min)
min=a[i];
}
}
sum1=maxsub[n-1].sum-min;
return sum1;
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
long long int n,i;
scanf("%lld",&n);
long long int a[n];
for(i=0;i<n;++i)
scanf("%lld",&a[i]);
long long int sum=0;
sum=find_max(a,n);
if(sum<=0)
{
printf("%lld\n",sum);
}
else
{
sum=max_sub(a,n);
printf("%lld\n",sum);
}
}
return 0;
}
#包括
#包括
#包括
结构结果{
长整型启动;
长内端;
长整和;
}res;
long long int find_max(long long int a[],long long int n)
{
长整型最大值=长整型最小值;
长内i;
对于(i=0;imax)
max=a[i];
}
返回最大值;
}
长整型最大值(长整型a[],长整型n)
{
长内i;
长整型最小值,sum1=0;
结构结果最大值,最大电流,*maxsub;
maxsub=calloc(sizeof(res),n);
最大和=最小值;
最大电流=最大值;
对于(i=0;i为什么从结果中减去最少的数字):
/*min=0;
for(i=maxsub[n-1].start;i<=maxsub[n-1].end;++i)
{
if(a[i]<0)
{
if(min==0 || a[i]<min)
min=a[i];
}
}*/
sum1=maxsub[n-1].sum;//-min;
return sum1; // Works fine
/*min=0;
对于(i=maxsub[n-1]。开始;i为什么从结果中减去最少的数字:
/*min=0;
for(i=maxsub[n-1].start;i<=maxsub[n-1].end;++i)
{
if(a[i]<0)
{
if(min==0 || a[i]<min)
min=a[i];
}
}*/
sum1=maxsub[n-1].sum;//-min;
return sum1; // Works fine
/*min=0;
对于(i=maxsub[n-1]),开始;i尝试这个数组{1,-100,6,-50,5}。
您正在以最大和删除子数组中的最小元素,但根据您的问题,您可以从原始数组中删除atmost一个元素,以最大化其相邻数组的和,这就是您得到错误答案的原因。尝试此数组{1,-100,6,-50,5}。
您正在以最大和删除子数组中的最小元素,但根据您的问题,您可以从原始数组中删除atmost一个元素,以最大化其相邻数组的和,这就是您得到错误答案的原因。显然,您已经实现了Kadane算法来查找ma数组中的x和子数组。
给定的数组是:[1,-2,3,-2,5]
卡丹的结果:[3,-2,5]
现在您要做的是:删除子阵列中的最小元素,这很不幸是不正确的。
现在假设给定的数组是:[1,-2,3,-2,5,-33,5]
卡丹的结果:[3,-2,5]
您的输出:[3,5],即8
但这里正确的答案是选择子阵列[3,-2,5,-33,5]
和消除'-33'
结果是:11。(3+5+5-2)
谢谢。
PS:我对stackoverflow的第一个回答。这只是我讨论过的一个例外,还有很多例外。
祝您好运!显然,您已经实现了Kadane算法来查找数组中的最大和子数组。
#include<stdio.h>
#include<limits.h>
long long int sum;
long long int rightsum(long long int a[], long int n, long int start, long int end) {
long int i;
long long int max_so_far=INT_MIN,max_ending_here=0;
for(i=start;i<=end;i++)
{
max_ending_here = max_ending_here + a[i];
if (max_so_far < max_ending_here)
{
max_so_far = max_ending_here;
}
}
return max_so_far;
}
long long int leftsum(long long int a[], long long int n, long long int start, long long int end) {
long int i;
long long int max_so_far=INT_MIN,max_ending_here=0;
for(i=end;i>=start;i--)
{
max_ending_here = max_ending_here + a[i];
if (max_so_far < max_ending_here)
{
max_so_far = max_ending_here;
}
}
return max_so_far;
}
long long int maxSum(long long int a[],long int n) {
long long int sum = rightsum(a, n, 1, n - 1);
long int i;
for (i = 0; i < n; i ++) {
long long int l = leftsum(a, n, 0, i - 1);
long long int r = rightsum(a, n, i + 1, n - 1);
if (((i > 0) && (i < n - 1)) && ( l>=0) && (r>0) && (l+r>sum)) {
sum = l+r;
if(sum<sum+a[i])
{
sum=sum+a[i];
}
}
else if ((i > 0) && (l >= r) && (l>sum)) {
sum = l;
if(sum<sum+a[i])
{
sum=sum+a[i];
}
}
else if ((i < n - 1) ) {
sum = r;
if(sum<sum+a[i])
{
sum=sum+a[i];
}
}
}
return sum;
}
int main()
{
int t;
long long i,n;
long long int a[100000];
scanf("%d",&t);
while(t!=0)
{
scanf("%ld",&n);
for(i=0;i<n;i++)
{
scanf("%lld",&a[i]);
}
printf("%lld\n",maxSum(a,n));
t--;
}
return 0;
}
给定的数组是:[1,-2,3,-2,5]
卡丹的结果:[3,-2,5]
现在您要做的是:删除子阵列中的最小元素,这很不幸是不正确的。
现在假设给定的数组是:[1,-2,3,-2,5,-33,5]
卡丹的结果:[3,-2,5]
您的输出:[3,5],即8
但这里正确的答案是选择子阵列[3,-2,5,-33,5]
和消除'-33'
结果是:11。(3+5+5-2)
谢谢。
PS:我对stackoverflow的第一个回答。这只是我讨论过的一个例外,还有很多例外。
祝你好运!包括
#include<stdio.h>
#include<limits.h>
long long int sum;
long long int rightsum(long long int a[], long int n, long int start, long int end) {
long int i;
long long int max_so_far=INT_MIN,max_ending_here=0;
for(i=start;i<=end;i++)
{
max_ending_here = max_ending_here + a[i];
if (max_so_far < max_ending_here)
{
max_so_far = max_ending_here;
}
}
return max_so_far;
}
long long int leftsum(long long int a[], long long int n, long long int start, long long int end) {
long int i;
long long int max_so_far=INT_MIN,max_ending_here=0;
for(i=end;i>=start;i--)
{
max_ending_here = max_ending_here + a[i];
if (max_so_far < max_ending_here)
{
max_so_far = max_ending_here;
}
}
return max_so_far;
}
long long int maxSum(long long int a[],long int n) {
long long int sum = rightsum(a, n, 1, n - 1);
long int i;
for (i = 0; i < n; i ++) {
long long int l = leftsum(a, n, 0, i - 1);
long long int r = rightsum(a, n, i + 1, n - 1);
if (((i > 0) && (i < n - 1)) && ( l>=0) && (r>0) && (l+r>sum)) {
sum = l+r;
if(sum<sum+a[i])
{
sum=sum+a[i];
}
}
else if ((i > 0) && (l >= r) && (l>sum)) {
sum = l;
if(sum<sum+a[i])
{
sum=sum+a[i];
}
}
else if ((i < n - 1) ) {
sum = r;
if(sum<sum+a[i])
{
sum=sum+a[i];
}
}
}
return sum;
}
int main()
{
int t;
long long i,n;
long long int a[100000];
scanf("%d",&t);
while(t!=0)
{
scanf("%ld",&n);
for(i=0;i<n;i++)
{
scanf("%lld",&a[i]);
}
printf("%lld\n",maxSum(a,n));
t--;
}
return 0;
}
#包括
长整和;
long long int rightsum(long long int a[],long int n,long int start,long int end){
long int i;
long long int max\u so\u far=int\u MIN,max\u ending\u here=0;
对于(i=start;i=start;i--)
{
max_ending_here=max_ending_here+a[i];
如果(最大值到目前为止<最大值到此结束)
{
max_so_far=max_ending_在此;
}
}
返回到目前为止的最大值;
}
长整型最大和(长整型a[],长整型n){
长整型和=右和(a,n,1,n-1);
long int i;
对于(i=0;i0)和&(i=0)和&(r>0)和&(l+r>sum)){
总和=l+r;
如果(求和0)和(l>=r)和(l>求和)){
总和=l;
如果(总和<代码>#包括
#包括
长整和;
long long int rightsum(long long int a[],long int n,long int start,long int end){
long int i;
long long int max\u so\u far=int\u MIN,max\u ending\u here=0;
对于(i=start;i=start;i--)
{
max_ending_here=max_ending_here+a[i];
如果(最大值到目前为止<最大值到此结束)
{
max_so_far=max_ending_在此;
}
}
返回到目前为止的最大值;
}
长整型最大和(长整型a[],长整型n){
长整型和=右和(a,n,1,n-1);
long int i;
对于(i=0;i0)和&(i=0)和&(r>0)和&(l+r>sum)){
总和=l+r;
如果(求和0)和(l>=r)和(l>求和)){
总和=l;
如果(sum请关闭此线程。OP试图在正在进行的在线竞赛中通过在此处发布问题进行作弊。请关闭此线程。OP试图在正在进行的在线竞赛中通过在此处发布问题进行作弊。嗯,这不公平,人们一直在努力破解它。这是一部分。)关于正在进行的code chef在线竞赛,请关闭此线程
编辑:比赛现在结束了,请公开讨论:)这是不公平的,人们一直在努力破解它。这是正在进行的代码厨师在线比赛的一部分,请关闭此线程
编辑:比赛现在结束了,请公开讨论:)你的意思是“删除一个元素”吗