• 现代程序设计——homework-02


    关于题目:

      题目地址:http://www.cnblogs.com/xinz/p/3318230.html

      首先,不得不说自从写完第一次作业,我就开始“抠”这个题,第一眼看这个题就感觉好“坑”,读一遍之后什么都木有发现,满满的一头雾水。连题目的描述都木有看明白!如图:文件格式描述中的输入数据格式是“每一行的元素,”样例元素是“5,6,-3,8,-9,2”。那么,“2”这个行末元素后面要不要加个逗号呢?32位有符号整数是默认成二进制表示的?我们假设输入格式是有“,”并且老师不会搞一个32位的十进制整数搞死我们。那么,可以的开始我们的苦逼解题之路:

    解题之路:

    阶段一:

    第一步:

      容错问题看起来有很多的样子:

    1. 文件打开错误处理;
    2. 输入的行列数与矩阵大小不等;
    3. 输入的数字并非合法数字;
    4. 输入数字、运算结果溢出;

      。

      。

      。

      。

      。

      。

    瞬间头大的感觉,我们还是一条一条开始慢慢解决吧!

    1、文件打开错误处理:

      写了一个暑假的Html和JavaSript,感觉命令行程序已经好久没碰过了,好陌生的感觉。翻一翻C语言的手册吧……在Stander I/O 里面找到了fopen函数,原来文件打开失败就会返回空指针,打开成功就返回文件指针,貌似有点儿头绪了……

     

     1 if(argc==2)
     2     {
     3         if((in = fopen(argv[1],"r+"))==NULL)
     4         {
     5             printf("Open file error, please make sure you have inputed right file name and location!");
     6             return 0;
     7         }
     8     }
     9     else
    10     {
    11         printf("Only one parameter of input file name is needed!");
    12         return 0;
    13     }

     

      2、输入的行列数与矩阵的大小不等:

        我假设input.txt文件的内容来自其他程序的输出,并且那个程序可能出现运行错误,那么我们就“顺理成章”地遇到了这种错误,遇到这种错误   怎么办?行列数小一点还好办,大不了读入的矩阵不完全,至少程序能顺利跑完,行列数都大一点儿也好办,至少我能亲眼看见程序死掉了。万一一个   大一点,一个小一点!?那就坑死人的节奏了!!!!这时候突然想到样例那个诡异的输入,“5,6,-3,8,-9,2”,原来少个“,”也会有好处!?   那么,我就以矩阵为标准进行读入了,行列号只是用来作为一个判断,本人比较懒,并且严重不喜欢动态分配空间,铁了心搞一个固定大小的数组,输   入的数组大了的话就对不起了,爷不给你算了!这用户两头要讲究一点儿嘛,说多大就多大,买张饼你想换个大的还得另加钱呢! 

    1 fscanf(in,"%d,%d,",&row,&column);
    2 if(row>Max_R||column>Max_C)
    3 {
    4     printf("Come on! Don't break rules of our deal!");
    5     return 0;
    6 }

      3、输入的数字并非合法数字:

        我笃定"Everything is possible",那么,我们需要判断每个输入的数字是否是个合法的数字,再次翻出手册,然后又尝试了几下,scanf同志还   是很地道的,输入的是数字他就吃进来,输入的不是数字就放到后面等着,还很人性的返回个“0”

     1 if(fscanf(in,"%d,%d",&row,&column)!=2)
     2     {
     3         printf("%d %d",row,column);
     4         printf("Row Column number illegal!");
     5         system("pause");
     6         return 0;
     7     }
     8     fgetc(in);
     9     if(row>Max_R||column>Max_C)
    10     {
    11         printf("Come on! Don't break rules of our deal!");
    12         system("pause");
    13         return 0;
    14     }
    15     printf("%d %d",row,column);
    16     for(i=0,endflag=0;i<row;i++)
    17     {
    18         for(j=0;j<column;j++)
    19         {
    20             
    21             endflag=fscanf(in,"%d",&matrix[i][j]);
    22             if(endflag==0)
    23             {
    24                 printf("Matrix number illegal!");
    25                 system("pause");
    26                 return 0;
    27             }
    28             if(endflag==EOF)
    29                 break;
    30             c=fgetc(in);
    31             if(c!=',')
    32                 if(j!=column-1)
    33                 {
    34                     printf("Shit problem!");
    35                     system("pause");
    36                     return 0;
    37                 }
    38                 else
    39                     break;
    40             //printf("%d%c",matrix[i][j],c);
    41         }
    42         if(endflag==EOF)
    43             if(i!=row-1)
    44             {
    45                 printf("Shit problem!");
    46                 system("pause");
    47                 return 0;
    48             }
    49             else
    50                 break;
    51     }

        不得不吐槽一把,容错处理好是一个“D”疼,中间测试了各种问题和不出问题的结果,各种截图会撑爆这篇博客的!!!,在此上一张图请注意问题的名称,感受一下我   当时的心情!!!

      4、输入数字、运行结果溢出:

        在第一天看这个题的时候,我和一个搞竞赛的“大牛”讨论过这个问题,他竟然说出了用“高精度”,我勒个擦的,当年写C语言作业就对这个玩   意儿有了阴影,就不手写了,重申一下,我是个比较懒的人,搞那么大的矩阵还要搞那么大的数!我真心不想给你算出结果来,于是,我这样处理,得   知long long int类型的数是有范围的(-9223372036854775808~9223372036854775807),那么,我搞一个字符串存这两个值的一半,如果你的输入中   的数有超过我的半值范围的,不好意思,我就不给你算了。至于结果嘛,我要弄一个乘数一个模最值的余数,用两个部分表示。

        我的方法实在是又有点投机取巧了,于是好好学习了一把高精度整数加法,附上链接一枚:

          http://blog.csdn.net/tukangzheng/article/details/6918922

         

      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 #define Max_R 10000
      4 #define Max_C 10000
      5 long long matrix[Max_R][Max_C];
      6 long long Min=-4611686018427387905;
      7 long long Max=4611686018427387904;
      8 int main(int argc, char *argv[])
      9 {
     10     int i,j,row,column,endflag,multtem=0,mult=0;
     11     long long tempsub,minsub,maxsub;
     12     char c;
     13     FILE *in;
     14     if(argc>=2)
     15     {
     16         if((in = fopen(argv[argc-1],"r+"))==NULL)
     17         {
     18             printf("%s %s Open file error, please make sure you have inputed right file name and location!",argv[0],argv[1]);
     19             system("pause");
     20             return 0;
     21         }
     22     }
     23     else
     24     {
     25         printf("%d,Only one parameter of input file name is needed!",argc);
     26         system("pause");
     27         return 0;
     28     }
     29     //printf("%d",fscanf(in,"%d,%d,",&row,&column));
     30     if(fscanf(in,"%d,%d",&row,&column)!=2)
     31     {
     32         printf("%d %d",row,column);
     33         printf("Row Column number illegal!");
     34         system("pause");
     35         return 0;
     36     }
     37     fgetc(in);
     38     if(row>Max_R||column>Max_C)
     39     {
     40         printf("Come on! Don't break rules of our deal!");
     41         system("pause");
     42         return 0;
     43     }
     44     printf("%d %d",row,column);
     45     for(i=0,endflag=0;i<row;i++)
     46     {
     47         for(j=0;j<column;j++)
     48         {
     49             
     50             endflag=fscanf(in,"%lld",&matrix[i][j]);
     51             if(matrix[i][j]>Max||matrix[i][j]<Min)
     52             {
     53                 printf("Please! I can't handle that");
     54                 system("pause");
     55                 return 0;
     56             }
     57             if(endflag==0)
     58             {
     59                 printf("Matrix number illegal!");
     60                 system("pause");
     61                 return 0;
     62             }
     63             if(endflag==EOF)
     64                 break;
     65             c=fgetc(in);
     66             if(c!=',')
     67                 if(j!=column-1)
     68                 {
     69                     printf("Shit problem!");
     70                     system("pause");
     71                     return 0;
     72                 }
     73                 else
     74                     break;
     75             //printf("%d%c",matrix[i][j],c);
     76         }
     77         if(endflag==EOF)
     78             if(i!=row-1)
     79             {
     80                 printf("Shit problem!");
     81                 system("pause");
     82                 return 0;
     83             }
     84             else
     85                 break;
     86     }
     87     if(row==1)
     88     {
     89         tempsub=0;
     90         //to get the minimum maxsub, find the minimum subarray;
     91         for(i=0;i<column;i++)
     92         {
     93             if(i==0)
     94                 minsub=matrix[0][0];
     95             if(minsub>matrix[0][i])
     96                 minsub=matrix[0][i];
     97         }
     98         maxsub=minsub;
     99         for(i=0;i<column;i++)
    100         {
    101             if(multtem>0||tempsub+matrix[0][i]>matrix[0][i])
    102                 tempsub=tempsub+matrix[0][i];
    103             else
    104                 tempsub=matrix[0][i];
    105             if(tempsub>Max)
    106             {
    107                 tempsub-=Max;
    108                 multtem++;
    109             }
    110             if(tempsub<Min)
    111             {
    112                 tempsub+=Max;
    113                 multtem--;
    114             }
    115             if(tempsub>maxsub)
    116             {
    117                 maxsub=tempsub;
    118                 mult=multtem;
    119             }
    120         }
    121         printf("Multiplier:%d Remainder:%lld
    ",mult,maxsub);
    122         system("pause");
    123         return 0;
    124     }
    125 }

        这是处理完第四个问题的代码,下面是运行的结果们:

    输入文件:

    1,

    6,

    5,6,-3,8,-9,2

    输入文件:

    1,

    6,

    5,6,3611686018427387904,4511686018427387904,2611686018427387904,1611686018427387904

    阶段二:

    第一步:

      分析一把这个题,还是可以按照老套路来的无非先枚举一下,不错,O(n^2*m^2)个子矩阵,如果每个矩阵都“善良”地一个一个求和,那么这个复杂度是O(n^4*m^4)于是,有点接受不了了,然后,无非Trade Memory一把,记录一下以前的计算结果,恩恩,非常明显O(n^3*m^3)了……,当然,这还是不能接受的,我们还是坐下来谈谈动态规划吧,说实话,我没有想出来什么好的动态规划的方法,我能想到的方法最坏情况下还是能到O(n^3*m^3)的,当然,我也就没闲心去计算它的平均复杂度了,于是找“度娘”请教了一把动态规划的方法,好像看明白了。于是玩命儿码代码,然后就是“第二天”了……

      代码加在一起实在是有点儿略长了,又是在第一个的基础上面改的,代码活生生就是一坨翔的感觉了,而且下面还有好长的路要走的!,不管怎么样,还是贴出来看一看,可能有些变量是全局变量,有些变量是在main函数里面,找起来好费劲的

      在main函数中:

    1     if(getsmatrix(in,row,column)==0)
    2         {
    3             system("pause");
    4             return 0;
    5         }
    6         printf("MaxSubmatrix:%d",MaxStep2(row,column));
    7         system("pause");
    8         return 0;

      getsmatric函数:

     1 int getsmatrix(FILE *in,int row, int column)
     2 {
     3     int i,j,endflag;
     4     char c;
     5     for(i=0,endflag=0;i<row;i++)
     6     {
     7         for(j=0;j<column;j++)
     8         {
     9             
    10             endflag=fscanf(in,"%d",&smatrix[i][j]);
    11             if(smatrix[i][j]>Max||smatrix[i][j]<Min)
    12             {
    13                 printf("Please! I can't handle that");
    14                 //system("pause");
    15                 return 0;
    16             }
    17             if(endflag==0)
    18             {
    19                 printf("Matrix number illegal!");
    20                 //system("pause");
    21                 return 0;
    22             }
    23             if(endflag==EOF)
    24                 break;
    25             c=fgetc(in);
    26             if(c!=',')
    27                 if(j!=column-1)
    28                 {
    29                     printf("Shit problem!");
    30                     //system("pause");
    31                     return 0;
    32                 }
    33                 else
    34                     break;
    35             //printf("%d%c",matrix[i][j],c);
    36         }
    37         if(endflag==EOF)
    38             if(i!=row-1)
    39             {
    40                 printf("Shit problem!");
    41                 //system("pause");
    42                 return 0;
    43             }
    44             else
    45                 break;
    46     }
    47     return 1;
    48 }

      (PS:这个函数是专门为非特别大的数准备的,我一直很怀疑long long型的变量计算起来会多消耗不止一两倍的时间,于是搞了一份int型的,毕竟超时死得更惨烈一些)

      MaxStep2函数:

     1 int MaxStep2(int row, int column)
     2 {
     3     int i,j,k,tempsub,maxsub,temparray[1000];
     4     //calculate sub;
     5     //memset(smatrix,0,sizeof(smatrix));
     6     for(i=0;i<row;i++)
     7     {
     8         for(j=0;j<column;j++)
     9             if(i==0)
    10                 record[i][j]=smatrix[i][j];
    11             else
    12                 record[i][j]=record[i-1][j]+smatrix[i][j];
    13     }
    14     for(i=0,maxsub=smatrix[0][0];i<row;i++)
    15     {
    16         for(j=0;j<=i;j++)
    17         {
    18             if(j==0)
    19                 tempsub=MaxSubarr(record[i],column);
    20             else
    21             {
    22                 for(k=0;k<column;k++)
    23                     temparray[k]=record[i][k]-record[j-1][k];
    24                 tempsub=MaxSubarr(temparray,column);
    25             }
    26             maxsub=MyMax(tempsub,maxsub);
    27         }
    28     }
    29     return maxsub;
    30 }

    测试数据1:

    3,
    6,
    5,6,-3,8,-9,2
    1,-12,20,0,-3,-5
    -9,-7,-3,6,7,-1

    测试结果: 

     

     

    测试数据2:

    8,
    12,
    8,-10,-3,26,-11,-1,-6,12,17,6,28,4
    20,-13,-20,-13,-15,-254,5,8,9,-4,-9,29
    -11,18,-25,9,12,-9,-2,23,8,-1,3,-14
    -16,-7,0,201,-1,309,3,6,-18,11,24,-8
    -1,-7,11,100,21,292,-2,2,-18,-8,-10,9
    26,-11,-19,-18,20,-981,2,-14,12,-14,1,27
    9,-20,5,28,-15,26,-20,-8,-16,30,3,20
    -6,-7,-5,-9,-16,-15,5,-16,22,-17,11,-18

      测试结果2:

    阶段三:

    第一步:

      在我还在做第一次作业的时候,肖神就已经在群里吵吵这个阶段不好做了,我记得当时大家在群里嚷嚷着要用状压DP、插头DP什么的,更有好事儿的还证明了一下这个问题是个NP,至少是个NPC问题,我勒个去的,他们好歹也都是搞ACM的,我等弱还是先绕路而行吧!

      我对这个题的一系列YY,因为大神们都说了要连通性状压DP了,而且都指数级复杂度了,我就不花时间琢磨精确解的事儿了,让我得出精确解,无非直接枚举——>判断连通性——>……然后复杂度很现实O(2^(m*n)*m*n);然后,剩下就是回溯搜索+剪枝了,因为利用连通性进行剪枝,相比于第一种做法优化效果还是很明显的,而且效果会随着矩阵的增大而更加明显。于是我就黔驴技穷了……

      当然,我就考虑“牺牲精度”了,当时跟鲁大师讨论这个问题,我说:“直接贪心一个次优解吧”,大师说:“那就是n优解了”……于是,我就考虑用贪心做了,贪心出来一个“次的n次方优解”还是可以接受的。我的贪心策略:利用规则子矩阵得到一个解——>对子矩阵轮廓进行扩展,加入邻接正值,删除边上负值……

      1 void MaxStep3(FILE *in,int row, int column)
      2 {
      3     int i,j,k,tempsub,maxsub,temparray[Max_C],cstart,cend,rstart,rend;
      4     struct SubarrayInfo sub;
      5     if(getsmatrix(in,row,column)==0)
      6         return ;
      7     //calculate sub;
      8     for(i=0;i<row;i++)
      9     {
     10         for(j=0;j<column;j++)
     11             if(i==0)
     12                 record[i][j]=smatrix[i][j];
     13             else
     14                 record[i][j]=record[i-1][j]+smatrix[i][j];
     15     }
     16     for(i=0,maxsub=smatrix[0][0];i<row;i++)
     17     {
     18         for(j=0;j<=i;j++)
     19         {
     20             if(j==0)
     21             {
     22                 sub=IMaxSub(record[i],column);
     23                 tempsub=sub.max;
     24             }
     25             else
     26             {
     27                 for(k=0;k<column;k++)
     28                     temparray[k]=record[i][k]-record[j-1][k];
     29                 sub=IMaxSub(temparray,column);
     30                 tempsub=sub.max;
     31             }
     32             if(tempsub>maxsub)
     33             {
     34                 maxsub=tempsub;
     35                 cstart=sub.start;
     36                 cend=sub.end;
     37                 rstart=j;
     38                 rend=i;
     39             }
     40         }
     41     }
     42     maxsub=AMaxSub(rstart,rend,cstart,cend,row,column,maxsub);
     43     printf("Step3---MaxSubmatrix:%d",maxsub);
     44 }
     45 struct SubarrayInfo IMaxSub(int *a,int n)
     46 {
     47     int tempsub,maxsub,start,tempstart=0,end;
     48     int i;
     49     struct SubarrayInfo sub;
     50     tempsub=0;
     51     maxsub=a[n-1];
     52     for(i=0;i<n;i++)
     53     {
     54         if(tempsub+a[i]<a[i])
     55         {
     56             tempstart=i;
     57             tempsub=a[i];
     58         }
     59         else
     60             tempsub+=a[i];
     61         if(tempsub>maxsub)
     62         {
     63             maxsub=tempsub;
     64             start=tempstart;
     65             end=i;
     66         }
     67     }
     68     sub.max=maxsub;
     69     sub.start=start;
     70     sub.end=end;
     71     return sub;
     72 }
     73 int AMaxSub(int rstart,int rend,int cstart,int cend,int row,int column,int maxsub)
     74 {
     75     int flag[Max_R][Max_C],i,j;
     76     memset(flag,0,sizeof(flag));
     77     for(i=rstart;i<=rend;i++)
     78         for(j=cstart;j<=cend;j++)
     79             flag[i][j]=1;
     80     while(rstart>0||rend<row-1||cstart>0||cend<column-1)
     81     {
     82         if(rstart>0)
     83             for(rstart--,i=cstart;i<column&&i<=cend&&i<column;i++)
     84                 if(flag[rstart+1][i]==1&&smatrix[rstart][i]>=0)
     85                 {
     86                     flag[rstart][i]=1;
     87                     maxsub+=smatrix[rstart][i];
     88                 }
     89         if(rend<row-1)
     90             for(rend++,i=cstart;i<=cend&&i<column;i++)
     91                 if(flag[rend-1][i]==1&&smatrix[rend][i]>+0)
     92                 {
     93                     flag[rend][i]=1;
     94                     maxsub+=smatrix[rend][i];
     95                 }
     96         if(cstart>0)
     97             for(cstart--,j=rstart;j<=rend&&j<row;j++)
     98                 if(flag[cstart-1][j]==1&&smatrix[cstart][j]>=0)
     99                 {
    100                     flag[cstart][j]=1;
    101                     maxsub+=smatrix[cstart][j];
    102                 }
    103         if(cend<column-1)
    104             for(cend++,j=rstart;j<=rend&&j<row;j++)
    105                 if(flag[cend+1][j]==1&&smatrix[cend][j]>=0)
    106                 {
    107                     flag[cend][j]=1;
    108                     maxsub+=smatrix[cend][j];
    109                 }
    110     }
    111     return maxsub;
    112 }

    3,
    6,
    5,6,-3,8,-9,2
    -1,-12,20,0,-3,-5
    -9,-7,-3,6,7,-1,

     

      (PS:陈丹琦老师的论文和ppt一时半会儿是看不懂了,等我从状压DP到连通性状压DP啃一遍再来补大神们的实现方案)

    阶段四:

    第一步:

      分析一下这个问题,看着好像挺玄乎的,好好的一个矩阵还要给人连起来,弄得没法下嘴开个口来做这个题,同时当时纠结在这个“在3的基础上”会不会也要求要不规则额???那岂不是死翘翘的节奏了。当然,后来鲁大师说这疑问还是挺水的,于是就默认矩阵是规则的了。突破口还是在一维上,只不过先把圆圈剪开,然后扫就好了,至于怎么剪,我打算把数组按照正负相间的子段进行合并,当然,把首位两部分同号的合并,于是:

      输入:5,6,-3,8,-9,2

      处理:13,-3,8-9

      对了?

      高兴太早了,这样还是没有完全剪断前后的联系的……

      于是,继续想,只能把每个数当头分别扫面一遍了,如果时间承受不了,可以用上面的方法优化一下长度。同理可解决垂直。

    第二步:

      终于算是高出来一个"/h“

      照例,贴上源代码+部分测试

     1 void MaxStep4H(FILE *in,int row, int column)
     2 {
     3     int i,j,k,tempsub,maxsub,temparray[1000];
     4     if(getsmatrix(in,row,column)==0)
     5         return ;
     6     //calculate sub;
     7     //memset(smatrix,0,sizeof(smatrix));
     8     for(i=0;i<row;i++)
     9     {
    10         for(j=0;j<column;j++)
    11             if(i==0)
    12                 record[i][j]=smatrix[i][j];
    13             else
    14                 record[i][j]=record[i-1][j]+smatrix[i][j];
    15     }
    16     for(i=0,maxsub=smatrix[0][0];i<row;i++)
    17     {
    18         for(j=0;j<=i;j++)
    19         {
    20             if(j==0)
    21                 tempsub=LMaxSubarr(record[i],column);
    22             else
    23             {
    24                 for(k=0;k<column;k++)
    25                     temparray[k]=record[i][k]-record[j-1][k];
    26                 tempsub=LMaxSubarr(temparray,column);
    27             }
    28             maxsub=MyMax(tempsub,maxsub);
    29         }
    30     }
    31     printf("Step4H---MaxSubmatrix:%d",maxsub);
    32 }
    33 int LMaxSubarr(int *a, int n)
    34 {
    35     int tempsub,maxsub,doua[2000];
    36     int i,j;
    37     for(i=0;i<n;i++)
    38         doua[i]=a[i];
    39     for(j=0;i<2*n;j++,i++)
    40         doua[i]=a[j];
    41     maxsub=a[n-1];
    42     for(i=0;i<n;i++)
    43         for(j=i,tempsub=0;j<i+n;j++)
    44         {
    45             tempsub=MyMax(tempsub+doua[j],doua[j]);
    46             if(tempsub>maxsub)
    47                 maxsub=tempsub;
    48         }
    49     return maxsub;
    50 }

    测试样例:

    1,

    6,

    5,6,-3,8,-9,2

      测试结果:

    第三步:

      02:32:49

      实在是有点儿早了,再熬我就实在饿得受不了了,贴上垂直的代码和测试,明天继续!

     1 void MaxStep4V(FILE *in,int row, int column)
     2 {
     3     int i,j,l,temp[2*Max_R][Max_C],maxsub,tempsub;
     4     if(getsmatrix(in,row,column)==0)
     5         return ;
     6     for(i=0;i<row;i++)
     7         for(j=0;j<column;j++)
     8             temp[i][j]=smatrix[i][j];
     9     for(l=0;i<2*row;i++,l++)
    10         for(j=0;j<column;j++)
    11             temp[i][j]=smatrix[l][j];
    12     //calculate sub;
    13     //memset(smatrix,0,sizeof(smatrix));
    14     for(i=0,maxsub=smatrix[0][0];i<row;i++)
    15     {
    16         tempsub=NMaxStep2(temp,row,column,i);
    17         maxsub=MyMax(tempsub,maxsub);
    18     }
    19     printf("Step4V---MaxSubmatrix:%d",maxsub);
    20 }
    21 int NMaxStep2(int a[][Max_C],int row,int column,int start)
    22 {
    23     int i,j,k,tempsub,maxsub,temparray[Max_C];
    24     //calculate sub;
    25     for(i=start,k=0;i<start+row;i++,k++)
    26     {
    27         for(j=0;j<column;j++)
    28             if(i==start)
    29                 record[k][j]=a[i][j];
    30             else
    31                 record[k][j]=record[k-1][j]+a[i][j];
    32     }
    33     //printf("%d",record[start][0]);
    34     for(i=0,maxsub=smatrix[0][0];i<row;i++)
    35     {
    36         for(j=0;j<=i;j++)
    37         {
    38             if(j==0)
    39                 tempsub=MaxSubarr(record[i],column);
    40             else
    41             {
    42                 for(k=0;k<column;k++)
    43                     temparray[k]=record[i][k]-record[j-1][k];
    44                 tempsub=MaxSubarr(temparray,column);
    45             }
    46             maxsub=MyMax(tempsub,maxsub);
    47         }
    48     }
    49     return maxsub;
    50 }

    测试数据:

    3,
    6,
    5,6,-3,8,-9,2
    -10,-10,-10,-10,-9,-9
    -7,8,4,7,-9,3

      输出结果:

    阶段五:

      这步如果只是一个规则的轮胎,那么好吧,把上一步的成果用一下的OK了,

      就改了几个字母,太饿了,不测试了!!!明天还要搞状压DP呢!!!还要弄单元测试!!!啊啊啊!!!!

     1 void MaxStep5(FILE *in,int row, int column)
     2 {
     3     int i,j,l,temp[2*Max_R][Max_C],maxsub,tempsub;
     4     if(getsmatrix(in,row,column)==0)
     5         return ;
     6     for(i=0;i<row;i++)
     7         for(j=0;j<column;j++)
     8             temp[i][j]=smatrix[i][j];
     9     for(l=0;i<2*row;i++,l++)
    10         for(j=0;j<column;j++)
    11             temp[i][j]=smatrix[l][j];
    12     //calculate sub;
    13     //memset(smatrix,0,sizeof(smatrix));
    14     for(i=0,maxsub=smatrix[0][0];i<row;i++)
    15     {
    16         tempsub=NMaxStep2(temp,row,column,i);
    17         maxsub=MyMax(tempsub,maxsub);
    18     }
    19     printf("Step4V---MaxSubmatrix:%d",maxsub);
    20 }
    21 int NMaxStep3(int a[][Max_C],int row,int column,int start)
    22 {
    23     int i,j,k,tempsub,maxsub,temparray[Max_C];
    24     //calculate sub;
    25     for(i=start,k=0;i<start+row;i++,k++)
    26     {
    27         for(j=0;j<column;j++)
    28             if(i==start)
    29                 record[k][j]=a[i][j];
    30             else
    31                 record[k][j]=record[k-1][j]+a[i][j];
    32     }
    33     //printf("%d",record[start][0]);
    34     for(i=0,maxsub=smatrix[0][0];i<row;i++)
    35     {
    36         for(j=0;j<=i;j++)
    37         {
    38             if(j==0)
    39                 tempsub=LMaxSubarr(record[i],column);
    40             else
    41             {
    42                 for(k=0;k<column;k++)
    43                     temparray[k]=record[i][k]-record[j-1][k];
    44                 tempsub=LMaxSubarr(temparray,column);
    45             }
    46             maxsub=MyMax(tempsub,maxsub);
    47         }
    48     }
    49     return maxsub;
    50 }

    感想收获:

      不得不说,这就一门C语言用得还凑合实在是受不了(le),我要尝试一下C++甚至C#,以前都接触过一点点,不用就扔了;这C语言学得也是很渣,要是有函数指针什么的,代码不会搞得这么多;学一学算法吧,看着大神们张嘴就各种DP各种复杂度,感觉自己太次了。

       还差一个单元测试!!!!

  • 相关阅读:
    工厂设计模式
    二分查找(java实现)
    集合
    JS中,根据div数值判断弹出窗口
    用JS,打印正立三角形
    用JS,打印99乘法表
    用JS,求斐波那契数列第n项的值
    用JS 循环做一个表格
    JS中,如何判断一个被转换的数是否是NaN
    用JS写一个简单的程序,算出100中7的倍数的最大值
  • 原文地址:https://www.cnblogs.com/hennande/p/3344934.html
Copyright © 2020-2023  润新知