homework01
第一眼看到这个题目的时候就意识到这道题应该使用动态规划来解决,但因代码能力有限,因此从一维的问题开始解决,用C语言编写,代码如下:
int maxsum(int *p,int size){ int i; int sum,ans; sum=0; ans=-1000000; for(i=0;i<size;i++){ if(sum+p[i]<p[i]) sum=0; sum+=p[i]; if(ans<sum) ans=sum; } return ans; }
p代表数组名字在C语言中即表示数组第一个元素所在的地址。一开始陷入的误区就是认为应该记录之前出现的和最大的字串的结束位置,后同学给予我提示即同时计算size-1个元素中包含最后一个元素的和最大的子串和和最大的子串。当包含最后一个元素的和最大的子串加上整个数组的最后一个元素的和大于原size-1的数字串的最大字串和的话我们就得到了一个更大的子串和,否则保留原来的子串和。 既然明白了一维的情况,那二维的情况就是讲二维转换为一维。即将n行m列的二维数组转换为n^2个长度为m的一维数组。代码如下:时间复杂度为O(m*n^2)
+int maxsum2(int *p,int m,int n){ + int i,j,k; + int temp[m]={0}; + sum=0; + ans=-1000000; + for(i=0;i<n;i++){ + for(j=i;j<n;j++){ + for(k=0;k<m;k++){ + temp[k]+=p[j][k]; + if(sum+temp[k]<temp[k]) + sum=0; + sum+=temp[k]; + if(ans<sum) + ans=sum; + } + sum=0; + } + sum=0; + temp[m]={0}; + } + return ans; +}
因C语言处理输入过于繁琐,并且邹欣老师主张我们多会几门编程语言,因此在室友的激励下,我决定将本次的作业用python实现。
代码如下:
x=raw_input("row number\n") y=raw_input("line number\n") f=open(x+y+".txt","r") num=[] for i in range(int(x)): for j in range(int(y)): l=f.readline() l=l.strip('\n').split(" ") num.append(l) def maxsum(num,y1,x1): temp=[0]*x1 s=0 a=-1000000 for i in range(y1): for j in range(i,y1): for k in range(x1): temp[k]+=int(num[j][k]) if(s+temp[k]<temp[k]): s=0 s+=temp[k] if(a<s): a=s s=0 s=0 temp=[0]*x1 return a print maxsum(num,int(x),int(y))
生成测试数据如下:
33 -78 158
-41 -31 283
189 -96 -13
-9 -152 277
最后结果为705
作业题目本身并不是很难,但是个人深刻的发现对除了C语言以外的编程语言仅仅是略懂皮毛,写出来的python代码也带有浓厚的C语言风格,并没有充分发挥出python开发效率高的特点,希望自己能够在此方面有所改进。