国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

C語言求向量和的兩則問題解答分享

2020-01-26 14:39:28
字體:
來源:轉載
供稿:網友

求一個向量的任何連續子向量的最大和

比如向量(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 );//最原始的算法,復雜度為T(n)=O(n*n)int oringinal( int v[], int len );//原始基礎上變體版,復雜度為T(n)=O(n*n)int oringinal_ex( int v[], int len );//分治法,復雜度為T(n)=O(n*log(n))/* *分治法的思想是:將原數組分成兩部分,要求的最大值 *要么在左邊這部分里面,要么在右邊這部分里面 *要么就在左右相交的交界處 */int divAndCon( int v[], int low, int high );//掃描法,復雜度為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;} //最原始的算法,復雜度為T(n)=O(n*n)int oringinal( int v[], int len ){     int maxsofar = 0;     int i;     int j;     int sum = 0;     //通過雙層循環逐步掃描,通過max( sum, maxsofar)獲得當前最大值     for( i = 0; i < len; i++ )     {       sum = 0;       for( j = i; j < len; j++ )       {         sum += v[j];         maxsofar = max( sum, maxsofar );        }     }     return maxsofar;}//原始基礎上變體版,復雜度為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;} //分治法,復雜度為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)); }//掃描法,復雜度為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)

求一個向量的任何連續最接近0的子向量的和

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

#include<stdio.h>#include<math.h>//返回最接近0的數int closeZero( int x, int y );//最原始的算法,復雜度為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的數int closeZero( int x, int y ){     if( abs(x) > abs(y) )     {       x = y;     }     return x;} //最原始的算法,復雜度為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;}

 運行結果:

201649165706546.jpg (654×97)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 莲花县| 新泰市| 涿鹿县| 岳池县| 莱阳市| 土默特左旗| 萝北县| 屏南县| 延长县| 邵武市| 曲周县| 汶上县| 汕尾市| 苏尼特左旗| 阳原县| 沙田区| 屏东市| 长葛市| 彩票| 邹平县| 平泉县| 三门县| 思南县| 湘西| 明水县| 偃师市| 上犹县| 临海市| 灌南县| 卢湾区| 彰化市| 格尔木市| 阿克陶县| 永和县| 黄陵县| 左云县| 明溪县| 喜德县| 台山市| 道孚县| 天柱县|