| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1326 人关注过本帖
标题:[原创]一个数列的最大和子数列(连续的),有兴趣的进来做做!
只看楼主 加入收藏
zhangzujin
Rank: 1
等 级:新手上路
帖 子:276
专家分:0
注 册:2005-5-9
收藏
 问题点数:0 回复次数:4 
[原创]一个数列的最大和子数列(连续的),有兴趣的进来做做!
我同学给我出了个难题,就是求一个数列的最大和连续子数列.
其定义为原数列中连续的数之和最大的数列.
如:
1 -3 4 5的最大子数列为:4,5,因为4+5最大.
3 4 -5 8 -4的最大子数列为:3,4,-5,8,因为3+4-5+8最大为10
4 3 -1 2的最大子数列为4,3,-1,2,因为4+3-1+2最大为8

其要求为:
1.第一行,用户输入n(数列个数);
2.第二行,输入数列各个数;
3.空一行
4.最大子数列和sum;
5.最大子数列;

如第一例为:
Input n:4
1 -3 4 5

sum=9
4,5

大家做做.希望以此提高自己编写程序的能力.
搜索更多相关主题的帖子: 大子 兴趣 sum 定义 难题 
2005-05-23 23:48
zhangzujin
Rank: 1
等 级:新手上路
帖 子:276
专家分:0
注 册:2005-5-9
收藏
得分:0 

自己编了差不多一个小时,主要时间用于调试,因为题义不太了解. 如下是我的程序,仅供参考,如有问题,请与我联系.qq:283421560 还有就是哪位有更好的程序,算法,告诉我,谢谢了. #include<stdio.h> #include<conio.h> #define N 100 int a[N];

void main( ) { int n,i,j,k[N],l,max,sum[N][N],s[N],m;

printf("Input n:"); scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); printf("\n");

for(i=0;i<n;i++) { s[i]=0; for(j=0;j<n;j++) sum[i][j]=0; }

for(i=0;i<n;i++) { for(j=i;j<n;j++) { sum[i][j]=0; for(m=i;m<=j;m++) sum[i][j]+=a[m]; }

s[i]=sum[i][i]; k[i]=i; for(j=i+1;j<n;j++) if(sum[i][j]>s[i]) { s[i]=sum[i][j]; k[i]=j; } }

max=s[0]; l=0; for(i=1;i<n;i++) if(s[i]>max) { max=s[i]; l=i; } printf("sum=%d\n",max); for(i=l;i<=k[l];i++) printf("%d,",a[i]); getch( ); }


太极之道 qq:283421560 E-mail:zhangzujin360732@
2005-05-23 23:52
kaikai
Rank: 1
等 级:新手上路
帖 子:236
专家分:0
注 册:2005-1-7
收藏
得分:0 

O(n^2) 比你的 O(n^3)好一些:) /* http://bbs.bc-cn.net/bbs/dispbbs.asp?boardID=5&ID=19147&page=2 最大和子序列 */

#include <stdio.h>

#define MAX_N 100

int main() { int num[MAX_N], sum[MAX_N]; int n, i, j, s; int bestBegin, bestEnd, bestSum; while(scanf("%d", &n) == 1 && n > 0) { for (i = 0; i < n; i++) scanf("%d", &num[i]); sum[0] = num[0]; for (i = 1; i < n; i++) sum[i] = sum[i-1] + num[i]; bestBegin = 0; bestEnd = 0; bestSum = num[0]; for (i = 0; i < n; i++) { for (j = i; j < n; j++) { s = i > 0? sum[j] - sum[i-1] : sum[j]; if (s > bestSum) { bestSum = s; bestBegin = i; bestEnd = j; } } } printf("%d\n%d", bestSum, num[bestBegin]); for (i = bestBegin+1; i <= bestEnd; i++) { printf(" %d", num[i]); } printf("\n"); } return 0; }


Have you visit acm.tongji. lately?
2005-05-27 20:17
zhangzujin
Rank: 1
等 级:新手上路
帖 子:276
专家分:0
注 册:2005-5-9
收藏
得分:0 
确实好.
s = i &gt; 0? sum[j] - sum[i-1] : sum[j];
这个语句什么意思啊?
if(i&gt;0)
 s=sum[j]-sum[i-1];
else
 s=sumj];
但是i除第一个之外总是大于0的啊?
是不是理解错了.

太极之道 qq:283421560 E-mail:zhangzujin360732@
2005-05-28 18:57
kaikai
Rank: 1
等 级:新手上路
帖 子:236
专家分:0
注 册:2005-1-7
收藏
得分:0 
你没有理解错,只是我不想为了这个特例而把循环体单独拿出去写一遍。

Have you visit acm.tongji. lately?
2005-05-28 20:57
快速回复:[原创]一个数列的最大和子数列(连续的),有兴趣的进来做做!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011953 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved