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

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. 图像二值化----otsu(最大类间方差法、大津算法)

    最大类间方差法是由日本学者大津于1979年提出的,是一种自适应的阈值确定的方法,又叫大津 法,简称OTSU.它是按图像的灰度特性,将图像分成背景和目标2部分.背景和目标之间的类间方差越大,说明构成图像 ...

  2. android rabbitMQ

    http://www.cnblogs.com/wufawei/archive/2012/03/31/2427823.html http://www.raywenderlich.com/5527/get ...

  3. Android相对布局(RelativeLayout)

    Android相对布局(RelativeLayout) 备注:这里的视图和元素是等同的概念. RelativeLayout是一个允许子视图相对于其他兄弟视图或是父视图显示的视图组(通过ID指定).每个 ...

  4. uva580Critical Mass

    递推.   用f[i]代表i个盒子的放法,设g[i]=2^n-f[i],代表i个盒子不满足条件的放法. 枚举第一个U所在的位置j.则方法有g[j-2]*(2^(i-j-2))种,j-1必须是L. 所以 ...

  5. UVa 1640 (计数) The Counting Problem

    题意: 统计[a, b]或[b, a]中0~9这些数字各出现多少次. 分析: 这道题可以和UVa 11361比较来看. 同样是利用这样一个“模板”,进行区间的分块,加速运算. 因为这里没有前导0,所以 ...

  6. 永久的CheckBox(单选,全选/反选)!

    <html> <head> <title>选择</title> <script type="text/javascript" ...

  7. 浅析Java中HashMap的实现

    概述 HashMap是一个散列表,是基于拉链法实现的.这个类继承了Map接口,Map接口提供了所有的哈希操作,比如set().put().remove()等,并且允许操作的键值对为null.HashM ...

  8. 如何解决重启数据库时报ORA-01031无法登数据库

    问题现象:以无用户方式登录数据库,重启或关闭数据时,遇到下列问题: C:\Documents and Settings\xuzhengzhu>sqlplus /nolog SQL*Plus: R ...

  9. 《C++ primer》--第7章

    删除指针后,该指针就变成了悬垂指针.悬垂指针指向曾经存放对象的内存,但该对象已经不再存在了. 习题7.8 举一个例子说明什么时候应该将形参定义为引用类型.再举一个例子说明什么时候不应该将形参定义为引用 ...

  10. WEB安全性测试测试用例(基础)

    建立整体的威胁模型,测试溢出漏洞.信息泄漏.错误处理.SQL 注入.身份验证和授权错误. 输入验证 客户端验证服务器端验证(禁用脚本调试,禁用Cookies) 1.输入很大的数(如4,294,967, ...