?? 最大子列.txt
字號(hào):
#include<stdio.h>
#include<stdlib.h>
#define N 10
void main(){//其實(shí)這里有一個(gè)規(guī)律,就是對(duì)于一個(gè)序列來說,如果一個(gè)子序列的和是最大的,
//那么這個(gè)子序列它的開頭任意項(xiàng)的和不為負(fù),從后往前算起的任意項(xiàng)的和也不為負(fù)。
//所以,如果當(dāng)一個(gè)序列的和為負(fù),那么它肯定就不會(huì)出現(xiàn)在和為最大的子序列中,
//這里,可以把i直接跳過這個(gè)序列,這樣line_max的時(shí)間復(fù)雜度會(huì)降成O(n),同理,
//一個(gè)矩陣也是這樣。順著這個(gè)思想做下去,應(yīng)該可以把時(shí)間復(fù)雜度降下來的。
//不過具體怎么樣,要想想才知道。對(duì)于一個(gè)序列求最大子序列可以這樣做:
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);
}
//如果一個(gè)子序列的和是最大的,那么這個(gè)子序列它的開頭任意項(xiàng)的和不為負(fù),
//從后往前算起的任意項(xiàng)的和也不為負(fù)。
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);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -