请问这段代码怎么修改?

从一组数据(长度为 n,其中 n <= 10000,数据的值都大于 -60000)中找出连续的一段数,使得这段数的和最大。

输入描述
第一行是一个正整数 n,表示数据的个数,从第二行开始是 n 个数据。

输出描述
一行,子段的最大和。

样例输入
5
1 -3 4 1 -9
样例输出
5

#include<stdio.h>
int main()
{
    int n,i,m=0,t=0,j;
    scanf("%d",&n);
    int a[n];
    for(i=0;i<n;i++)
    scanf("%d",&a[i]);
    t=0;
    for(i=0;i<n;i++)
    {
        m=0;
        for(j=i+1;j<n;j++)
        {
            if(a[j]>a[j-1])
            m+=a[j];
        }
        if(m>t) t=m;
    }
    printf("%d",t);
    return 0;
}

修改如下,供参考:

#include<stdio.h>
int main()
{
    int n,i,m=0,t=0,j;
    scanf("%d",&n);
    int a[10001];  // n <= 10000
    for(i=0;i<n;i++)
    scanf("%d",&a[i]);
    t=0;
    for(i=0;i<n;i++)
    {
        m=0;
        for(j=i;j<n;j++)//for(j=i+1;j<n;j++)
        {
                        //if(a[j]>a[j-1])
            m+=a[j];
            if(m > t) t=m; //移动到这
        }
    }
    printf("%d",t);
    return 0;
}

a[n];这样定义是错误的,必须固定数组大小。可以改成 int* a = (int*)malloc(sizeof(int)*n);最后在free掉a;
其次,逻辑有问题,建议改为:

#include<stdio.h>
int main()
{
    int n,i,m=0,t=0,j,k=0;
    scanf("%d",&n);
    int* a = (int*)malloc(sizeof(int)*n);
    for(i=0;i<n;i++)
    scanf("%d",&a[i]);
    t=0;
    for(i=0;i<n;i++)
    {
        m=0,k=0;
        for(j=i+1;j<n;j++)
        {
            k +=a[j];
            if(k>m)
            m = k;
        }
        if(m>t)
            t=m;
    }
    printf("%d",t);
    free(a)
    return 0;
}

温馨提示:若问题解决了,望给个采纳,谢谢!若有其他疑问随时咨询

关键点:a[j]>a[j-1],不是两个值对比哦,是和值得大小比较

1、效果如下

img

2、代码修改如下

#include<stdio.h>
int main()
{
    int n,i,m=0,t=0,j;
    printf("请输入数据长度:");
    scanf("%d\n",&n);
    int a[n];
    
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);

    t=0;
    for(i=0;i<n;i++)
    {
        m=0;
        for(j=i;j<n;j++)
        {
            m+=a[j];
            if(m>=t)
                t=m;
        }
    }
    printf("%d\n",t);
    return 0;
}

计算每个区间的值就行

#include<stdio.h>
int main()
{
    int n;
    int t[10000];
    int i,j,h;
    int max=-60000;
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
        scanf("%d",&t[i]);
    }
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            int sum=0;
            for(h=i; h<=j; h++)
            {
                sum+=t[h];
            }
            if(sum>max)
            {
                max=sum;
            }
        }
    }
    printf("%d",max);
    return 0;
}

这是个算法题啊,应该找算法相关的同学,如果只是简单的把所有可能性算一遍,10000个数字要计算5000万次,这应该不是个好的解决办法

#include <stdio.h>
#include <limits.h>

#define N 10001

int a[N];

int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
        scanf("%d", &a[i]);
    int max = INT_MIN;
    for (int i = 0; i < n; i++)
    {
        int sum = 0;
        int max_sum = INT_MIN;
        for (int j = i; j < n; j++)
        {
            sum += a[j];
            if (sum > max_sum)
                max_sum = sum;
        }
        if (max_sum > max)
            max = max_sum;
    }
    printf("%d", max);
    return 0;
}

#include<stdio.h>
#include<stdlib.h>    //动态分配空间需导入此头文件

int main()
{
    int n,i,m=0,t=0,j;

    scanf("%d", &n);    //输入个数
    int *a = (int *)malloc(sizeof(int) * n);    //分配空间给指向整型的指针变量(sizeof(int)返回整型类型的大小,乘n得到n个数的大小的空间)(动态分配函数需进行地址的强制类型转换)

    for(i = 0; i < n; i++)    //输入指定个数的数据
        scanf("%d", &a[i]);

    for(i = 0; i < n; i++)    //外循环(进行n次获取数据)
    {
        m=0;    //每次外循环时赋值为0
        for(j = i; j < n; j++)    //内循环(获取i~n长度的数据)
        {
            m += a[j];    //m加上第j个元素
            if(m > t) t = m;    //如果m的值大于t, t = m
        }
    }

    printf("%d", t);
    return 0;
}
 
 //每次内循环的输出结果(a[i~n])
 //1 -3  4  1 -9    (第一次)
 //-3  4  1 -9        (第二次)
 // 4  1 -9            (第三次)
 // 1 -9            (第四次)
 //-9                (第五次)


 //第一次内循环(m = 0, t = 0)(a[0 ~ n-1])
 //m += a[j] 依次为 1 -2  2  3 -6 (m 最大时为3, t = 3//t值为3

 //第二次内循环(m = 0, t = 3) (a[1 ~ n-1])
 //m += a[j] 依次为 -3  1  2 -7 (m最大时为2,小于t, 所以t不变)
 //t值为3

 //第三次内循环(m = 0, t = 3) (a[2 ~ n-1])
 //m += a[j] 依次为 4  5 -4 (m最大时为5,t = 3 < m, t = 5//t值为5

 //第四次内循环(m = 0, t = 5) (a[3 ~ n-1])
 //m += a[j] 依次为 1 -8 (m最大时为1,t为5, t 不变)
 //t值为5

 //第五次内循环(m = 0, t = 5) (a[4 ~ n-1])
 //m += a[j] 依次为  -9 (m最大时为-9,t为5,t不变)
 //t值为5


#include <bits/stdc++.h>
using namespace std;

int a[101],n,dp[101];
 
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    
    dp[1]=a[1];
    
    int ma=dp[1];
    for(int i=2;i<=n;i++)
    {
        dp[i]=max(a[i],dp[i-1]+a[i]);
        ma=max(ma,dp[i]);
    }
    
    cout<<ma;
    return 0;
}

动归