a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁(yè) > 編程 > C > 正文

C語(yǔ)言求向量和的兩則問(wèn)題解答分享

2020-01-26 14:39:28
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

求一個(gè)向量的任何連續(xù)子向量的最大和

比如向量(31,-41,59,26,-53,58,97,-93,-23,84);
最大和是從59到97即為187

#include<stdio.h>#include<stdlib.h>//兩者的最大值int max( int x, int y );//三者的最大值int max2( int x, int y, int z );//最原始的算法,復(fù)雜度為T(n)=O(n*n)int oringinal( int v[], int len );//原始基礎(chǔ)上變體版,復(fù)雜度為T(n)=O(n*n)int oringinal_ex( int v[], int len );//分治法,復(fù)雜度為T(n)=O(n*log(n))/* *分治法的思想是:將原數(shù)組分成兩部分,要求的最大值 *要么在左邊這部分里面,要么在右邊這部分里面 *要么就在左右相交的交界處 */int divAndCon( int v[], int low, int high );//掃描法,復(fù)雜度為T(n)=O(n)int scan(int v[], int len);void main(){     int i = 0;     int v[] = {31,-41,59,26,-53,58,97,-93,-23,84};     int len = 0;     int result;     len = sizeof(v) / sizeof(int);     printf("oringinal datas:/n");     for( i = 0; i < len; i++ )     {       printf("%d/t",v[i]);     }     printf("/n");     //最原始的算法     result = oringinal(v,len);     printf("oringinal(v,len):%d/n",result);     //最原始變體的算法     result = oringinal_ex(v,len);     printf("oringinal_ex(v,len):%d/n",result);     //分治法     result = divAndCon(v,0,len-1);     printf("divAndCon(v,0,len):%d/n",result);     //掃描法     result = scan(v,len);     printf("scan(v,len):%d/n",result);}//兩者的最大值int max( int x, int y ){     if( x < y )     {        x = y;     }     return x;}//三者的最大值int max2( int x, int y, int z ){     if( x < y )     {       x = y;     }     if( x < z )     {       x = z;     }     return x;} //最原始的算法,復(fù)雜度為T(n)=O(n*n)int oringinal( int v[], int len ){     int maxsofar = 0;     int i;     int j;     int sum = 0;     //通過(guò)雙層循環(huán)逐步掃描,通過(guò)max( sum, maxsofar)獲得當(dāng)前最大值     for( i = 0; i < len; i++ )     {       sum = 0;       for( j = i; j < len; j++ )       {         sum += v[j];         maxsofar = max( sum, maxsofar );        }     }     return maxsofar;}//原始基礎(chǔ)上變體版,復(fù)雜度為T(n)=O(n*n)int oringinal_ex( int v[], int len ){     int i = 0;     int j = 0;     int sum = 0;     int maxsofar = 0;     int *cumarr = ( int * )malloc( len * sizeof(int) );      for( i = 0; i < len; i++ )    {       if( i == 0 )       {         cumarr[0] = v[i];       }       else       {         cumarr[i] = cumarr[i-1] + v[i];       }      }    for( i = 0; i < len; i++ )      for( j = i; j < len; j++ )      {        if( i == 0 )        {           sum = cumarr[i];         }         else        {           sum = cumarr[j] - cumarr[i-1];         }         maxsofar = max(maxsofar,sum);      }      return maxsofar;} //分治法,復(fù)雜度為T(n)=O(n*log(n))int divAndCon( int v[], int low, int high ){    int mid = 0;    int lmax = 0;    int rmax = 0;    int sum = 0;    int i = 0;    if( low > high )    {      return 0;    }    if( low == high )    {      return max(0,v[low]);    }    mid = ( low + high ) / 2;    lmax = sum = 0;    for( i = mid; i >= low; i-- )    {       sum += v[i];       lmax = max(lmax,sum);    }    rmax = sum = 0;    for( i = mid + 1; i <= high; i++ )    {      sum +=v[i];      rmax = max(rmax,sum);    }    return max2(lmax + rmax,divAndCon(v,low,mid),divAndCon(v,mid+1,high)); }//掃描法,復(fù)雜度為T(n)=O(n)int scan(int v[], int len){     int maxsofar = 0;     int maxendinghere = 0;     int i = 0;     for( i =0; i < len; i++ )     {       maxendinghere = max(maxendinghere + v[i],0);       maxsofar = max(maxsofar,maxendinghere);     }     return maxsofar;} 

201649165648580.jpg (674×144)

求一個(gè)向量的任何連續(xù)最接近0的子向量的和

比如向量(31,-41,59,26,-53,58,97,-93,-23,84);
最大和是從97到-93即為4

#include<stdio.h>#include<math.h>//返回最接近0的數(shù)int closeZero( int x, int y );//最原始的算法,復(fù)雜度為T(n)=O(n*n)int oringinal( int v[], int len );void main(){     int i = 0;     int v[] = {31,-41,59,26,-53,58,97,-93,-23,84};     int len = 0;     int result;     len = sizeof(v) / sizeof(int);     printf("oringinal datas:/n");     for( i = 0; i < len; i++ )    {      printf("%d/t",v[i]);    }    printf("/n");    //最原始的算法    result = oringinal(v,len);    printf("oringinal(v,len):%d/n",result); }//返回最接近0的數(shù)int closeZero( int x, int y ){     if( abs(x) > abs(y) )     {       x = y;     }     return x;} //最原始的算法,復(fù)雜度為T(n)=O(n*n)int oringinal( int v[], int len ){     int sofar = v[0];     int i;     int j;     int sum = 0;     for( i = 0; i < len; i++ )     {       sum = 0;       for( j = i; j < len; j++ )       {         sum += v[j];         sofar = closeZero( sum, sofar );       }     }      return sofar;}

 運(yùn)行結(jié)果:

201649165706546.jpg (654×97)

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 高清成人在线 | 狠狠操中文字幕 | 精品一区久久 | 日本高清视频网站www | 国产传媒在线视频 | 一区二区三区在线 | 成人精品久久久 | 欧美极品视频 | 亚洲精品乱码久久久久久蜜桃不卡 | 91精彩刺激对白露脸偷拍 | 久久国内精品 | 亚洲国产一区视频 | 爱爱无遮挡| 久久久久国产一区二区三区 | 一级欧美日韩 | 欧美成人一区二区 | 成人在线免费 | 国产成人精品一区二 | 中文字幕日本一区 | 国产不卡一区 | 看男人操女人逼 | 欧美高清视频一区二区三区 | 欧美日韩视频在线播放 | 色呦呦日韩 | 国产精品福利久久 | 亚洲视频中文字幕 | 91资源总站 | 国产精品一区二区三区在线播放 | 国产亚洲精品久久久久久豆腐 | 久久99精品久久久久久久青青日本 | 欧美日韩成人 | 日韩精品小视频 | 黄色一级电影 | 白色白色在线视频 | 国产中文视频 | 伊人免费视频二 | 日韩影院在线 | 九九视频这里只有精品 | 国产中文字幕在线观看 | 黑人巨大精品欧美一区二区免费 | 国产综合久久久久久鬼色 |