写在前面:我的算法能力很弱,并且也是第一次写博文,总之希望自己能在这次的课程中学到很多贴近实践的东西吧。

1、这次的程序是python写的,这也算是我第一次正正经经地拿python来写东西,结果上来说光是语法上就出了不少问题,总是写写停停,时不时要百度、Google一下。最麻烦的是因为我习惯使用sublime作文本编译器,结果还有无法使用中文注释的问题没有解决,很是捉急。(后来经杰仔教导,注释问题解决,我不会说我只是把第一行打错了 = =)

2、“最大子数组之和”问题的一维问题(我是这么叫的)在助教的博客里面已经被解决,并且得出了非常漂亮的O(n)的解法。理所当然地,我希望在这一基础上,通过一个矩阵地不断推进来解决“最大子数组之和“的二维问题。

  但是,这一想法很快遇到了阻力。在二维空间中一个矩形的形状变化有很多种,并且所涉及的改变处的数字和很难统计,也无法简单地设计出遍历所有可能情况的算法。

  于是我希望将该二维问题化为一维问题来解决。为此,我将行数通过两次循环遍历,相当于将问题划归成n(n+1)/2个“最大子数组之和”问题的一维问题。每一问题即为在行数限定、列数可变的数组内寻找最大子数组之和的问题。

  于是所得代码如下,

  

# coding:utf-8
'''
2013-9-17 XTH
'''
n1 = raw_input("please input the row number of array") #the row number of array
n2 = raw_input("please input the line number of array") #the line number of array
f = open(n1 + "," + n2 + ".txt","r")
num=[[]]*int(n1)
for i in range(0,int(n1)):
line = f.readline()
line = line.strip('\n')
num[i] = line.split(",")
num=[[int(x) for x in inner] for inner in num] # 从一个txt文件中读入测试数据(测试数据由另一个python程序产生)
# 该问题的解决思路即通过两次循环遍历将该二维问题转化为多个一维问题
def max_2d(num,n1,n2):
line = [0]*n2
max_sum = 0 #最大和
fore_sum = 0 #
now_sum = 0 #当前和
x = [0]*2
y = [0]*2
for i in range(0,n1):
for j in range(i,n1):
x[0] = i
y[0] = 0
for k in range(0,n2):
line[k] += num[j][k]
if fore_sum <0:
now_sum = 0
y[0]=k
now_sum += line[k]
if now_sum > max_sum:
max_sum = now_sum
y[1]=k
x[1]=j
x2=x[0]
y2=y[0]
now_sum = 0
now_sum=0
line = [0]*n2
return "the max num is " + str(max_sum) + "\n"+ "the area is " + str(x2) + "," + str(y2) + " to " + str(x[1]) + "," + str(y[1])
print(max_2d(num,int(n1),int(n2)))

  然后是生成测试数据的代码:

import random

x = raw_input("please input row number of array")
y = raw_input("please input line number of array")
filename = x + "," + y + ".txt"
f = open(filename,"w")
for i in range(0,int(x)):
for j in range(0,int(y)):
f.write(str(random.randint(-50,100)))
if j<int(y)-1 :f.write(",")
f.write("\n")
f.close()

  对于测试数据

 
  有运行结果
 
 
  经过人工验证,结果无误。

homework-01 "最大子数组之和"的问题求解过程的更多相关文章

  1. homework-01 "最大子数组之和"的解决过程

    看到这个题目,我首先想到就是暴力解决 求出所有的子数组的和,取出最大值即可 但其中是可以有优化的 如 子数组[3:6]可以用[3:5]+[6]来计算 即可以将前面的计算结果保留下来,减少后面的重复计算 ...

  2. homework-02 "最大子数组之和"的问题进阶

    代码编写 这次的作业瞬间难了好多,无论是问题本身的难度或者是单元测试这一原来没接触过的概念或者是命令行参数的处理这些琐碎的问题,都使得这次作业的完成说不上轻松. 最大子数组之和垂直水平相连的拓展问题解 ...

  3. 求一个二维整数数组最大子数组之和,时间复杂度为N^2

    本随笔只由于时间原因,我就只写写思想了 二维数组最大子数组之和,可以  引用  一维最大子数组之和 的思想一维最大子数组之和 的思想,在本博客上有,这里就不做多的介绍了 我们有一个最初的二维数组a[n ...

  4. [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 ...

  5. 求一个整数数组最大子数组之和,时间复杂度为N

    #include<iostream.h> int main () { ]={-,-,-,-,-,-,-,-,-,-}; ],sum=; ;i<;i++) { ) { sum=b[i] ...

  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 ...

  7. 最大子数组之和(N)

    int maxSum(int *array, int n) { ]; ; ; ; i < n; i++) { ) newsum += array[i]; else newsum = array[ ...

  8. [LeetCode] Maximum Product Subarray 求最大子数组乘积

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  9. [LeetCode] Maximum Subarray 最大子数组

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

随机推荐

  1. maven小项目注册服务(三)--web模块

    java的web应用打包方式一般为war它和jar的区别就是包含了更多的资源和文件,如JSP文件,静态资源文件,servlet等等.war包的核心就WEB-INF文件夹下必须有一个web.xml 的配 ...

  2. RecyclerView(5)官方教程带简单示例

    Create Lists The RecyclerView widget is a more advanced and flexible version of ListView. This widge ...

  3. ggplot2 demo

    title <- rep("A Really Rather Long Text Label", 25)value <- runif(25, 1,10)spacing & ...

  4. Java对ArrayList进行排序

    数字使用直接比较大小来排序,String的话,使用compare()方法进行排序. 测试代码: 1.对字符串对象排序 @Test public void test17() throws Excepti ...

  5. git跨平台换行符不兼容

    https://help.github.com/articles/dealing-with-line-endings/#platform-all

  6. [转载]Python模块学习 ---- subprocess 创建子进程

    [转自]http://blog.sciencenet.cn/blog-600900-499638.html 最近,我们老大要我写一个守护者程序,对服务器进程进行守护.如果服务器不幸挂掉了,守护者能即时 ...

  7. POJ 2828 Buy Tickets (线段树 单点更新 变形)

    题目链接 题意:有N个人排队,给出各个人想插队的位置和标识,要求输出最后的序列. 分析:因为之前的序列会因为插队而变化,如果直接算时间复杂度很高,所以可以用 线段树逆序插入,把序列都插到最后一层,le ...

  8. 關於NPOI的一點補充和示例

    最近看到很多人分享NPOI的用法. 但是很多都不是完整示例或者並沒有實戰效果. 剛好最近有個VB.NET的項目有升級原有的oledb select sheet$的做法. 很明顯,NPOI有更好的穩定性 ...

  9. Asp.net 后台添加Meta标签方法

    Asp.net 后台添加Meta标签方法包括keywords,CSS.JS 下面是从Asp.net 后台添加CSS.JS.Meta标签的写法,我们这里写成函数方便以后使用.如果函数放在页面类中, Pa ...

  10. php和java的一些比较

    现在市场上的电子商务软件基本上可归结为两大阵营,即PHP阵营和Java阵营.但对接触电子商务不久的用户来说,看到的往往只是它们的表相,只是明显的价格差异,却很难看出它们之间的实际差异.其实,PHP+ ...