zoukankan      html  css  js  c++  java
  • 【现代程序设计】【homework02】【11061027】

    Q:描述在这么多相似的需求面前, 你怎么维护你的设计 (父类/子类/基类, UML, 设计模式,  或者其它方法) 让整个程序的架构不至于崩溃的?

    A:由于使用的是面向过程的C语言,所以维护设计这个问题,更多的是通过调试

    Q:给出你做单元测试/代码覆盖率的最终覆盖率的报告, 用截屏显示你的代码覆盖率

    A:......我用的GCC工具似乎不具有代码覆盖率检查的功能。。。。

    Q:阅读 工程师的能力评估和发展 和相关文章, 在完成作业的时候记录自己花费的时间, 并填下表。如果你对有些术语不太清楚,请查看教材和其它资料。如果你认为你不需要做某个步骤, 那就跳过去。

     

    Personal Software Process Stages

    时间百分比(%)

    实际花费的时间 (分钟)

    原来估计的时间 (分钟)

    计划

         

    ·         估计这个任务需要多少时间,把工作细化并大致排序

     0  0  0

    开发

         

    ·         需求分析 (包括学习新技术)

     5  30min  0

    ·         生成设计文档

     0  0  0

    ·         设计复审 (和同事审核设计文档)

     0  0  0

    ·         代码规范 (制定合适的规范)

     0  0  0

    ·         具体设计

     55  10h  4h

    ·         具体编码

     20  4h  4h

    ·         代码复审

     5  1h  30min

    ·         测试(自我测试,修改代码,提交修改)

     15  3h  1h

    总结报告

         
         
           
           
    Total 总计 100% 总用时 总估计的用时

     

    Q:你在这个作业中学到了什么?  有什么好的设计值得分享?  感想如何 (太容易 / 太难 / 太无趣)?

    A:学到了关于命令行的使用,感想就是:太难!

     

    1.   开始之前

    在一维的求解中,我们已经知:

    假设f[i]表示:1..i这个序列中,包含i这个元素的最大连续序列之和

    显然 f[1]=a[1];

    f[i]=f[i-1]+a[i];     f[i-1]>0

    f[i]=a[i];    f[i-1]<=0

    max(f[i])即为最后的结果

    2.   二维数组的最大子矩阵

    这里假设输入的矩阵为P,行和列值分别约定为m,n

     

    对于2维数组,我们虽然无法直接使用1维中的思路

    但是,如果我们可以把一整行看做一个元素

    按照1维的思路,我们就可以得到一个最大的n*x的矩阵A,0<x<m

     

    显然A不一定是最后的答案,因为矩阵A的列值y被我们限定为了n

    所以我们需要枚举y,即y←1..n

     

    之后要做的就很简单了

     

    枚举行值等于m,列值为y,的所有矩阵D,并找出D中的最大子矩阵E

    对于所有的E,max(E)就是最后的答案

     

     

    时间复杂度=T[求1维最大子数组]*T[枚举矩阵]*T[计算矩阵每一行的值]

     

    前者已知为O(n)

    枚举矩阵则需要一个二重的循环,即为O(n^2)

     

    对于计算矩阵D中没一行的值

    我们可以进行预处理

     

    假设D在P中的位置为:第x列→第y列

    如果我们用一个数组g[i][j]表示:第i行的1..j列的元素之和为g[i][j];

    则对于D中的每一行的和应该为g[i][y]-g[i][x],(0<i<=m)

    每次计算的复杂度为O(1)

     

    所以总的时间复杂度为:O(N^3)

     

    空间复杂度:

    主要用于存储P,D,E

    为:O(n^2

     

     

    3.   二维数组的最大子矩阵(连通)

    联通问题,和不连通的区别只是:边界的连续性问题

    因此我们只需增加三个同样的矩阵P1,P2,P3

    排列为:

    P(原矩阵)      P2(如果水平联通)

    P1(如果垂直联通)  P3(如果同时联通)

    按照第二步的思路,同时保证所枚举的矩阵D

    行值小于m,列值小于 n

    即可求出起解

    时间复杂度和空间复杂度同二

    时间复杂度为: O(N^3)

    空间复杂度:    O(n^2)

    4.   二维数组的最大连通图形

    对于此问题,我暂时想不到更好的解决办法

    只能通过递归生成所有联通图形,求解最大值

    时间效率相当之低:

    O(2^(m*n))

      1 #include <stdio.h>
      2 #include <string.h>
      3 #define M 100
      4 #define max(a,b) (a)>(b)?(a):(b)
      5 #define sinput "input.txt"
      6 
      7 FILE *file;
      8 int a[M][M],i,j,m,n,s;
      9 int color[M][M];
     10 int dx[]={-1,0,1,0},dy[]={0,-1,0,1};
     11 
     12 void F()
     13 {
     14     int g[M][M],f[M][M],i,j,s,x,k;
     15     for(i=0;i<m;i++)
     16     for(j=0;j<n;j++) f[i][j]=g[i][j]=0;
     17     
     18     s=a[0][0];
     19     
     20     for(i=0;i<m;i++){
     21         g[i][0]=a[i][0];
     22         for(j=1;j<n;j++) g[i][j]=g[i][j-1]+a[i][j];
     23     }
     24     
     25     for(i=0;i<m;i++)
     26     for(j=0;j<n;j++)
     27     for(k=j;k<n;k++){
     28         x=g[i][k]-g[i][j]+a[i][j];
     29         if(f[j][k]>0) f[j][k]+=x;
     30         else f[j][k]=x;
     31         if(f[j][k]>s) s=f[j][k];
     32     }
     33     printf("%d",s);
     34 }
     35 
     36 
     37 void Fvh(int v,int h)
     38 {
     39     int g[M][M],f[M][M],l[M][M],i,j,s,aa[M][M],nn,mm,nx,x,k,;
     40     
     41     nn=n;
     42     mm=m;
     43     
     44     if(h) nn=2*n;
     45     if(v) mm=2*m;
     46     
     47     for(i=0;i<mm;i++)
     48     for(j=0;j<nn;j++){
     49         aa[i][j]=a[i%m][j%n];
     50         l[j][k]=f[i][j]=g[i][j]=0;
     51     }
     52     
     53     s=a[0][0];
     54     
     55     
     56     for(i=0;i<mm;i++){
     57         g[i][0]=aa[i][0];
     58         for(j=1;j<nn;j++) g[i][j]=g[i][j-1]+aa[i][j];
     59     }
     60     
     61     for(i=0;i<mm;i++)
     62     for(j=0;j<nn;j++)
     63     for(k=j,nx=0;k<nn;k++,nx++){
     64         
     65         if(nx>=n) break;
     66 
     67         
     68         x=g[i][k]-g[i][j]+aa[i][j];
     69         
     70         if(f[j][k]>0&&l[j][k]<m){
     71             f[j][k]+=x;
     72             l[j][k]++;
     73         }
     74         else{
     75             f[j][k]=x;
     76             l[j][k]=1;
     77         }
     78         
     79         if(f[j][k]>s) s=f[j][k];
     80 
     81     }
     82     printf("%d",s);
     83 
     84 }
     85 
     86 
     87 
     88 int IsInvh(int x,int y)
     89 {
     90     if(x>=0&&x<m&&y>=0&&y<n) return 1;
     91     return 0;
     92 }
     93 
     94 
     95 void fany(int x,int y,int z)
     96 {
     97     int tx,ty,i;
     98     
     99     if(s<z) s=z;
    100     for(i=0;i<4;i++){
    101         tx=x+dx[i];
    102         ty=y+dy[i];
    103         if(IsInvh(tx,ty)&&!color[tx][ty]){
    104             color[tx][ty]=1;
    105             fany(tx,ty,z+a[tx][ty]);
    106             color[tx][ty]=0;
    107         }
    108     }
    109 }
    110 
    111 
    112 
    113 
    114 
    115 
    116 main(int N,char **CMD)
    117 {
    118     int h,v,u;
    119     u=h=v=0;
    120     file=fopen(sinput,"r");
    121     fscanf(file,"%d, %d, ",&m,&n);
    122     for(i=0;i<m;i++)
    123     for(j=0;j<n;j++) fscanf(file,"%d, ",a[i]+j);
    124     
    125     fclose(file);
    126     for(i=1;i<N;i++){
    127         if(!strcmp(CMD[i],"/h")) h=1;
    128         if(!strcmp(CMD[i],"/v")) v=1;
    129         if(!strcmp(CMD[i],"/a")) u=1;
    130     }
    131     
    132     
    133     if(!(h+v)&&!u){
    134         F();
    135         return 0;
    136     }
    137     if(!u){
    138         Fvh(v,h);
    139         return 0;
    140     }
    141     
    142     
    143     for(i=0;i<m;i++)
    144     for(j=0;j<n;j++){
    145         color[i][j]=1;
    146         fany(i,j,a[i][j]);
    147         color[i][j]=0;
    148     }
    149     printf("%d",s);
    150     
    151 }
  • 相关阅读:
    电子商务运营模式
    PHP 常用资源
    Ajax 常用资源
    java 常用资源
    Net 常用资源
    Web App 响应式页面制作 笔记整理
    移动端click事件延迟300ms该如何解决
    阻止冒泡事件
    关于jquery stopPropagation()阻止冒泡事件
    集算器如何处理类文本数据计算
  • 原文地址:https://www.cnblogs.com/lightz/p/3348381.html
Copyright © 2011-2022 走看看