从一组数据(长度为 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、效果如下
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;
}
动归