homework-02 "最大子数组之和"的问题进阶
代码编写
这次的作业瞬间难了好多,无论是问题本身的难度或者是单元测试这一原来没接触过的概念或者是命令行参数的处理这些琐碎的问题,都使得这次作业的完成说不上轻松。
最大子数组之和垂直水平相连的拓展问题解决关键在于循环语句的适度改写,连通问题则是用递归搜索的方法来解决(效率没有实测),在15*15的情况下还是能较快得出结果的。
非常庆幸使用的是Python,Pyhton中很多语法能够保证我在编写代码时不用分太多的时间去处理数据输入,在处理问题上一些数组相关灵活的语法也很大程度上方便了代码的编写。
# coding:utf-8
'''
2013-9-30 XTH
'''
import sys def setglobalvar():
global max_sum,now_sum,min_x,min_y,num,visited,pointgroup
max_sum = 0
now_sum = 0
min_x = 0
min_y = 0
num = []
visited = {}
pointgroup = [] def maxsum_h(num,n1,n2):#水平上相连
line = [0]*n2
max_sum = 0 #最大和
now_sum = 0 #当前和
for l in range (0,n2):
for i in range(0,n1):
for j in range(i,n1):
for k in range(0+l,n2+l):
k = k % n2
line[k] += num[j][k]
if now_sum <0:
now_sum = 0
now_sum += line[k]
if now_sum > max_sum:
max_sum = now_sum
now_sum = 0
now_sum=0
line = [0]*n2
return max_sum def maxsum_v(num,n1,n2): #垂直上相连
line = [0]*n2
max_sum = 0 #最大和
now_sum = 0 #当前和
for l in range (0,n1):
for i in range(0,n1):
for j in range(i+l,n1+l):
for k in range(0,n2):
j = j % n1
line[k] += num[j][k]
if now_sum <0:
now_sum = 0
now_sum += line[k]
if now_sum > max_sum:
max_sum = now_sum
now_sum = 0
now_sum=0
line = [0]*n2
return max_sum def maxsum(num,n1,n2):#普通
line = [0]*n2
max_sum = 0 #最大和
now_sum = 0 #当前和
for i in range(0,n1):
for j in range(i,n1):
for k in range(0,n2):
line[k] += num[j][k]
if now_sum <0:
now_sum = 0
now_sum += line[k]
if now_sum > max_sum:
max_sum = now_sum
now_sum = 0
now_sum=0
line = [0]*n2
return max_sum def maxsum_vh(num,n1,n2):#垂直水平相连
line = [0]*n2
max_sum = 0 #最大和
now_sum = 0 #当前和
for l1 in range (0,n1):
for l2 in range (0,n2):
for i in range(0,n1):
for j in range(i+l1,n1+l1):
for k in range(0+l2,n2+l2):
j = j % n1
k = k % n2
line[k] += num[j][k]
if now_sum <0:
now_sum = 0
now_sum += line[k]
if now_sum > max_sum:
max_sum = now_sum
now_sum = 0
now_sum=0
line = [0]*n2
return max_sum 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,n1,n2): #连通
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,n1):
for j in range(0,n2):
visited[i,j] = 0
for i in range(0,n1):
for j in range(0,n2):
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,n1,n2): #水平垂直上相连 连通
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,n1):
for j in range(0,n2):
visited[i,j] = 0
for i in range(0,n1):
for j in range(0,n2):
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 main():
setglobalvar()
global n1,n2
max_sum = 0
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];
try:
f = open(filename,"r")
except:
raise IOError("ERROR:can't open the file")
try:
line = f.readline()
line = line.strip('\n').strip(',')
n1 = int(line)
line = f.readline()
line = line.strip('\n').strip(',')
n2 = int(line)
num=[[]]*int(n1)
for i in range(0,int(n1)):
line = f.readline()
line = line.strip('\n')
if len(line.split(",")) != n2:
raise ValueError("ERROR:the format of file is wrong")
num[i] = line.split(",")
num=[[int(x) for x in inner] for inner in num]
except:
raise ValueError("ERROR:the format of file is wrong")
if V!=True and H!=True and A == True:#连通
max_sum = maxsum_a(num,n1,n2);
elif V==True and H!=True and A != True:#水平上相连
max_sum = maxsum_v(num,n1,n2);
elif V!=True and H==True and A != True:#垂直上相连
max_sum = maxsum_h(num,n1,n2);
elif V==True and H==True and A != True:#水平垂直上相连
max_sum = maxsum_vh(num,n1,n2);
elif V==True and H==True and A == True:#水平垂直上相连连通
max_sum = maxsum_vha(num,n1,n2);
else:#普通
max_sum = maxsum(num,n1,n2);
return max_sum if __name__ == '__main__':
print main()
单元测试
我大概明白单元测试的概念,但是本次问题很难被看做是一个模块,写单元测试的时候也无从下手,只是简单地测试了一下命令行参数的处理、以及样例的结果验证。
项目时间
PSP2.1 |
Personal Software Process Stages |
Time (%) Senior Student |
Planning |
计划 |
6 |
· Estimate |
· 估计这个任务需要多少时间 |
6 |
Development |
开发 |
80 |
· Analysis |
· 需求分析 (包括学习新技术) |
10 |
· Design Spec |
· 生成设计文档 |
0 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
0 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
0 |
· Design |
· 具体设计 |
15 |
· Coding |
· 具体编码 |
40 |
· Code Review |
· 代码复审 |
5 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
10 |
Reporting |
报告 |
14 |
|
2 |
|
|
2 |
|
|
10 |
总结
由于进入大学之后没有搞过ACM,在解决这个问题的时候非常得吃力,对于群里大家提出的想法也只能是不明觉厉,希望能够在接下来的课程中多多提高吧。
homework-02 "最大子数组之和"的问题进阶的更多相关文章
- homework-01 "最大子数组之和"的问题求解过程
写在前面:我的算法能力很弱,并且也是第一次写博文,总之希望自己能在这次的课程中学到很多贴近实践的东西吧. 1.这次的程序是python写的,这也算是我第一次正正经经地拿python来写东西,结果上来说 ...
- 求一个二维整数数组最大子数组之和,时间复杂度为N^2
本随笔只由于时间原因,我就只写写思想了 二维数组最大子数组之和,可以 引用 一维最大子数组之和 的思想一维最大子数组之和 的思想,在本博客上有,这里就不做多的介绍了 我们有一个最初的二维数组a[n ...
- [LeetCode] Maximum Size Subarray Sum Equals k 最大子数组之和为k
Given an array nums and a target value k, find the maximum length of a subarray that sums to k. If t ...
- 求一个整数数组最大子数组之和,时间复杂度为N
#include<iostream.h> int main () { ]={-,-,-,-,-,-,-,-,-,-}; ],sum=; ;i<;i++) { ) { sum=b[i] ...
- homework-01 "最大子数组之和"的解决过程
看到这个题目,我首先想到就是暴力解决 求出所有的子数组的和,取出最大值即可 但其中是可以有优化的 如 子数组[3:6]可以用[3:5]+[6]来计算 即可以将前面的计算结果保留下来,减少后面的重复计算 ...
- [Swift]LeetCode325. 最大子数组之和为k $ Maximum Size Subarray Sum Equals k
Given an array nums and a target value k, find the maximum length of a subarray that sums to k. If t ...
- 最大子数组之和(N)
int maxSum(int *array, int n) { ]; ; ; ; i < n; i++) { ) newsum += array[i]; else newsum = array[ ...
- [LeetCode] Maximum Product Subarray 求最大子数组乘积
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- [LeetCode] Maximum Subarray 最大子数组
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
随机推荐
- 如何学习一个新的PHP框架
如今的PHP框架层出不穷,我不是这方面的专家,甚至不能熟练地使用其中的一种,所以我不做推荐,也不想讨论哪些算是框架哪些不算框架.这里我要讨论的是如何才能更快地开始使用某个新的框架. 首先你当然必须选择 ...
- BZOJ 3140 消毒(最小顶点覆盖)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3140 题意:最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格 ...
- 网站常见问题及解决方法(div/css)
18.<a> 在IE6,7 下面重新定义宽和高的代码:{ display:block; display:-moz-inline-stack; display:inline-block; ...
- 如何过滤 adb logcat 输出
对原作者表示感谢,转自博客:http://www.otechu.me/zh/2011/12/filtering-adb-logcat-output/ 本文介绍如何在 shell 命令行中过滤 adb ...
- uva 10131 Is Bigger Smarter ? (简单dp 最长上升子序列变形 路径输出)
题目链接 题意:有好多行,每行两个数字,代表大象的体重和智商,求大象体重越来越大,智商越来越低的最长序列,并输出. 思路:先排一下序,再按照最长上升子序列计算就行. 还有注意输入, 刚开始我是这样输入 ...
- uva1637Double Patience
状态压缩,记忆化搜索. 用一个5进制数来表示每堆排到了哪一个位置.和2进制是一样的,不过不能用位运算. #include<cstdio> #include<algorithm> ...
- UVa 11609 (计数 公式推导) Teams
n个人里选k个人有C(n, k)中方法,再从里面选一人当队长,有k中方法. 所以答案就是 第一步的变形只要按照组合数公式展开把n提出来即可. #include <cstdio> typed ...
- BZOJ3806: Neerc2011 Dictionary Size
题解: 这题搞得我真是酸(dan)爽(teng) 原来一直不会,一定会用到什么神奇的东西.因为重复的不知道如何计算. 今天中午睡起来忽然想到好像可以在正trie上故意走无出边,因为这样就保证了这次统计 ...
- js判断浏览器类型和内核
function judge() { var sUserAgent = navigator.userAgent.toLocaleLowerCase(); var isLinux = (String(n ...
- codevs 1218 疫情控制
啊好烦这道题.... 基本思路网上都有. 注意的一点是在匹配的时候,如果有军队的来源没有被匹配到,那么就先匹配这个来源.(因为不花钱). 不过数据好水.... #include<iostream ...