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

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

    可以进行多处同时编辑 用C-n选择第一个单词,再次按住选住下一个单词,C-p放弃当前选中的,返回到第上一个,C-x放弃当前选中的,光标到下一处 选中一段文本后用:MultipleCursorsFind ...

  2. 在BSP的.bat文件下設置全局變量方法

    用于多個產品共用一個BSP的時候,在BSP的.bat文件中設置全局變量,去掉不需要加載的驅動和不同點是很好的方法. 一,舉例:BSP中.bat的一段code: set BSP_SMDK2443=1 s ...

  3. bzoj3926

    题目的意思是叶子不超过20个……听说当初zjoi不少人被坑 分别对每个叶子以它为根dfs出20个dfs树,这样整个树的任何一个子串,都是某个dfs树上一个点到它的一个子孙的路径 每个dfs树,根到叶子 ...

  4. uva12034Race

    递推,组合. 考虑第一名有i个人,则f[n]=sum(C(n,i)*f[n-i]),递推即可.. #include<cstdio> #include<algorithm> #i ...

  5. bzoj3798: 特殊的质数

    分块打表.块内的暴力块外的打表.开始没有j>0所以WA了. #include<cstdio> #include<cmath> #include<cstring> ...

  6. CORS 跨域 实现思路及相关解决方案

    本篇包括以下内容: CORS 定义 CORS 对比 JSONP CORS,BROWSER支持情况 主要用途 Ajax请求跨域资源的异常 CORS 实现思路 安全说明 CORS 几种解决方案 自定义CO ...

  7. HDU 3844 Mining Your Own Business(割点,经典)

    题意: 给出一个连通图,要求将某些点涂黑,使得无论哪个点(包括相关的边)撤掉后能够成功使得剩下的所有点能够到达任意一个涂黑的点,颜料不多,涂黑的点越少越好,并输出要涂几个点和有多少种涂法. 思路: 要 ...

  8. apache开源项目--subversion

    Subversion exists to be universally recognized and adopted as an open-source, centralized version co ...

  9. Java [Leetcode 206]Reverse Linked List

    题目描述: Reverse a singly linked list. 解题思路: 使用递归或者迭代的方法. 代码如下: 方法一:递归 /** * Definition for singly-link ...

  10. UVa 11292 The Dragon of Loowater 勇者斗恶龙

    你的王国里有一条n个头的恶龙,你希望雇佣一些骑士把它杀死(也就是砍掉所有的头).村里有m个骑士可以雇佣,一个能力值为 x 的骑士可以砍掉恶龙一个直径不超过 x 的头,且需要支付 x 个金币.如何雇佣骑 ...