您的位置:首页 > 其它

homework-02

2013-10-01 01:54 190 查看
先上代码

import sys

def maxsum_h(num,y1,x1):
temp=[0]*x1
s=0
a=-1000000
for q in range(y1):
for i in range(y1):
for j in range(i,y1):
for k in range(x1):
temp[k]+=int(num[(j+q)%y1][k])
if(s+temp[k]<temp[k]):
s=0
s+=temp[k]
if(a<s):
a=s
s=0
s=0
temp=[0]*x1
s=0
temp=[0]*x1
return a

def maxsum_v(num,y1,x1):
temp=[0]*x1
s=0
a=-1000000
for t in range(x1):
for i in range(y1):
for j in range(i,y1):
for k in range(x1):
temp[(k+t)%x1]+=int(num[j][(k+t)%x1])
if(s+temp[(k+t)%x1]<temp[(k+t)%x1]):
s=0
s+=temp[(k+t)%x1]
if(a<s):
a=s
s=0
s=0
temp=[0]*x1
s=0
temp=[0]*x1
return a

def maxsum_vh(num,y1,x1):
temp=[0]*x1
s=0
a=-1000000
for q in range(y1):
for t in range(x1):
for i in range(y1):
for j in range(i,y1):
for k in range(x1):
temp[(k+t)%x1]+=int(num[(j+q)%y1][(k+t)%x1])
if(s+temp[(k+t)%x1]<temp[(k+t)%x1]):
s=0
s+=temp[(k+t)%x1]
if(a<s):
a=s
s=0
s=0
temp=[0]*x1
s=0
temp=[0]*x1
return a

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

def searchthrough(x,y,num,now_sum):
global max_sum,pointgroup,min_x,min_y,visited
max_sum = max(max_sum, now_sum)
for i in [[0,-1],[1,0],[0,1],[-1,0]]:
if x+i[0]>=min_x and x+i[0]<n1 and y+i[1]>=min_y and y+i[1]<n2 and visited[(x+i[0])%n1,(y+i[1])%n2]==0 and [(x+i[0])%n1,(y+i[1])%n2,num[(x+i[0])% n1][(y+i[1])%n2]] not in pointgroup:
pointgroup.append([(x + i[0]) % n1, (y + i[1]) % n2, num[(x + i[0]) % n1][(y + i[1]) % n2]])
if pointgroup == []:
return
pointgroup = sorted(pointgroup, key=lambda x: x[2])
nextpoint = pointgroup.pop()
if now_sum + nextpoint[2] > 0:
visited[nextpoint[0], nextpoint[1]] = 1
searchthrough(nextpoint[0],nextpoint[1],num,now_sum + nextpoint[2])
visited[nextpoint[0], nextpoint[1]] = 0
else:
return

def maxsum_a(num,x1,y1):
global min_x,min_y,max_sum,visited
min_x = 0
min_y = 0
max_sum = 0
now_sum = 0
startpointx = []
startpointy = []
pointgroup = []
for i in range(0,x1):
for j in range(0,y1):
visited[i,j] = 0
for i in range(0,x1):
for j in range(0,y1):
if num[i][j] > 0:
startpointx.append(i)
startpointy.append(j)
for pointx in startpointx:
pointy = startpointy.pop()
visited[pointx, pointy] = 1
searchthrough(pointx,pointy,num,num[pointx][pointy])
return max_sum

def maxsum_vha(num,x1,y1):
global min_x,min_y,max_sum,visited
min_x = -n1
min_y = -n2
max_sum = 0
now_sum = 0
startpointx = []
startpointy = []
pointgroup = []
for i in range(0,x1):
for j in range(0,y1):
visited[i,j] = 0
for i in range(0,x1):
for j in range(0,y1):
if num[i][j] > 0:
startpointx.append(i)
startpointy.append(j)
for pointx in startpointx:
pointy = startpointy.pop()
visited[pointx, pointy] = 1
searchthrough(pointx,pointy,num,num[pointx][pointy])
return max_sum

num=[]
V=H=A=False
if "\\v" in sys.argv[1:]:
V=True
if "\\h" in sys.argv[1:]:
H = True
if "\\a" in sys.argv[1:]:
A = True
filename=sys.argv[-1]
f=open(filename,"r")
l=f.readline()
l=l.strip('\n').strip(",")
x=l
l=f.readline()
l=l.strip('\n').strip(",")
y=l
for i in range(int(x)):
for j in range(int(y)):
l=f.readline()
l=l.strip('\n').split(",")
num.append(l)
if V!=True and H!=True and A==True:
max_sum=maxsum_a(num,int(x),int(y))
elif V==True and H!=True and A != True:
max_sum = maxsum_v(num,int(x),int(y))
elif V!=True and H==True and A != True:
max_sum = maxsum_h(num,int(x),int(y))
elif V==True and H==True and A != True:
max_sum = maxsum_vh(num,int(x),int(y))
elif V==True and H==True and A == True:
max_sum = maxsum_vha(num,int(x),int(y))
else:
max_sum = maxsum(num,int(x),int(y))
print max_sum


首先,也是最简单的情况,即不存在相连,也不存在连通的情况。
这种情况我在第一次作业中已经说明。二维的情况就是讲二维转换为一维。即将n行m列的二维数组转换为n^2个长度为m的一维数组。时间复杂度为O(m*n^2)

然后我们考虑上下相连的情况,原矩阵若是可以上下相连则等同于有n个不同的二维数组。我们仅需进行计算n次二维数组的最大字串和,时间复杂度为O(m*n^3)

左右相连同理,时间复杂度为O(m^2*n^3)

然后就到了最让人觉得恼火的连通情况了。虽然说状态压缩动态规划可能是对这个问题的一个很好的解决方案,但是我不会啊!所以就采用了跟其他同学一样的暴力算法,对于一个m*n的矩阵,时间复杂度就要有O(2^(m+n)),可想而知效率如何。所能做的事情就是不断的深度搜索。

这次作业除了连通情况外,其他情况均很好解决。并且充分体现出了python效率高的特点,但是还是写出来的python代码还是有C代码的直视感。并且觉得如果一直是这样难度的作业的话,很难去用不是很熟悉的编程语言来完成。

最后是项目时间表格

PSP2.1

Personal Software Process Stages

Time (%) Senior Student

Planning

计划

4

· Estimate

· 估计这个任务需要多少时间

4

Development

开发

80

· Analysis

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

10

· Design Spec

· 生成设计文档

0

· Design Review

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

0

· Coding Standard

· 代码规范 (为目前的开发制定合适的规范)

0

· Design

· 具体设计

10

· Coding

· 具体编码

40

· Code Review

· 代码复审

10

· Test

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

10

Reporting

报告

16

· Test Report

· 测试报告

3

· Size Measurement

· 计算工作量

3

· Postmortem & Process Improvement Plan

· 事后总结, 并提出过程改进计划

10

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: