⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 最大子列.txt

📁 中过科学技术大学历年复试机试题
💻 TXT
字号:
#include<stdio.h>
#include<stdlib.h>

#define N 10

void main(){//其实这里有一个规律,就是对于一个序列来说,如果一个子序列的和是最大的,
	        //那么这个子序列它的开头任意项的和不为负,从后往前算起的任意项的和也不为负。
	        //所以,如果当一个序列的和为负,那么它肯定就不会出现在和为最大的子序列中,
	        //这里,可以把i直接跳过这个序列,这样line_max的时间复杂度会降成O(n),同理,
	        //一个矩阵也是这样。顺着这个思想做下去,应该可以把时间复杂度降下来的。
	        //不过具体怎么样,要想想才知道。对于一个序列求最大子序列可以这样做:
  int a[10];
  FILE *fp,*fpp;
  
  if((fp=fopen("e:\\yt\\yt01.txt","r"))==NULL){
      printf("file open error!\n");
      exit(0);
  }
  
  if((fpp=fopen("e:\\yt\\yt02.txt","a"))==NULL){
      printf("file open error!\n");
      exit(1);
  }

   //如果一个子序列的和是最大的,那么这个子序列它的开头任意项的和不为负,
   //从后往前算起的任意项的和也不为负。
  int i,j;
  int e,s,curSum,maxSum=0;
  while(!feof(fp)){
     for(i=0;i<N;i++){
       fscanf(fp,"%d",&a[i]);
	   fgetc(fp);
	 }
      
	 curSum=0;
	 maxSum=0;  

     for(i=0,j=0;j<N;j++){
	     curSum+=a[j];
		 if(curSum>maxSum){
		    s=i;
			e=j;
            maxSum=curSum;		 
		 }
		 else if(curSum<0){
		       i=j+1;
		       curSum=0;
		 }
	 
	 }
	 for(i=s;i<=e;i++){
	   fprintf(fpp,"%d ",a[i]);
       printf("%d ",a[i]);
	 }
	 fprintf(fpp,"\n s=%d  e=%d maxSum=%d \n",s,e,maxSum);
     printf("\n s=%d  e=%d maxSum=%d \n",s,e,maxSum);
    
  }

  fclose(fp);
  fclose(fpp);

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -