homework-02

先上代码

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

 

 

posted on 2013-10-01 01:54  wwtbuaa  阅读(134)  评论(1编辑  收藏  举报