zoukankan      html  css  js  c++  java
  • [课程相关]homework-01

    1)先写我的 github 的介绍:

    github 的域名:http://www.github.com/jeanhwea

    登入 github 大概是下面的视图:

    2)我选择的教材: code complete2

    最大子数组之和

    这个问题想明白了大致还是比较简单的,我想的是一个O(n) 的算法,大致思路就是,首先将前面的元素相加,并把和记为b,如果该和小于0,那么就把前面的相加之和丢弃掉,从新从下一个元素相加,(明显,如果前面的元素之和小于0,那么最大的子数组之和不应该包含这些元素,因为它们对子数组之和有不利的影响)

    每次扫描过一个元素,就把当前的子数组之和和一个当前保存的值做比较,(这个值可以初始化为0),如果当前数组之和大于这个保存值,那么就把这个当前数组之和的值保存下来,这样,扫描过一遍数组之后,就得到了当前数组的最大子数组之和的值。

    int maxSum(int* a, int n)    
    {    
        int sum=0;     int b=0; 
        int i=0;
        for(i=0; i<n; i++)    
        {    
            if(b<0)           //...     
                b=a[i];    
            else    
                b+=a[i];    
            if(sum<b)    
                sum=b;    
        }    
        return sum;    
    } 

    把所求的数组放入这个函数中,并输入数组的长度你n,就可以返回数组的最大长度。

    需要注意的一点是,这个算法对于数组元素全是负数的情况之下会返回0,也可以扫描整个数组,返回最大的负数,但是返回0,就意味着子数组选择了0个,也是合理的

    主函数

    int main(int argc, char* argv[])
    {
        FILE *in;
    
        int i=0,j=0,k=0,z=0,t=0,temp[200]={0};
        int n,m,d[200][200],sum=0,s=0;
        int test[10]={1,2,3,-1,2,3,1};
        char path[50];
        
        j=strlen(argv[0]);
        for(;j>=0;j--)
        {
            if((int)argv[0][j]==92)
                break;
        }
        for(i=0;i<=j;i++)
            path[i]=argv[0][i];
        path[i]='';
        
        strcat(path,argv[argc-1]);
    //    printf("%s
    ",path);
        in=fopen(path,"r");
        fscanf(in,"%d",&n);
        fscanf(in,"%d",&m);
        if(argc>4)
        {printf("too many arguments");exit(0);}
            
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                fscanf(in,"%d",&d[i][j]);
            }
        }
      //if(strcmp(argv[1],"-h"))
     // {
         sum=maxSum(d[0],m);
      //}
    
       printf("%d
    ",sum);
    
        for(;;);    
    }

    main函数前面处理的命令行参数的问题,以便可以合理打开test.txt,另外,我这里申请了一个200*200的二维数组,是为了实现下一次作业,这次作业只要求实现一维,那么我就改写一下输入,让输入只有一行即可。

    一些测试用例

    命令行运行:

    结果

    可见输出了正确的结果

    另附几组测试用例

    结果

    可见本程序较好的解决了这一问题。

    至于二维的问题相关,将会在下一次博客中更新

  • 相关阅读:
    listview删除item
    标准listview加图标布局
    android事件消费机制,从外传到里面,里面具有优先选择权,如果里面的不需要,则传递给外面一层消费
    listview 按最新数据展示
    给listview添加数据,添加数据之后即刻显示出来,并把数据放在listview列表的最前面
    EditText限制输入长度和限定输入数字
    josn解析常见的几种方法
    bnu Robots on a grid
    hdu 1348 Wall
    hdu poj Oulipo
  • 原文地址:https://www.cnblogs.com/cqd123123/p/3329911.html
Copyright © 2011-2022 走看看