【现代程序设计】【homework-02】【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 }