采用动态规划策略,python实现与C++实现等价。
Python 代码:
# -*- coding:utf-8 -*- class SubMatrix: def fun(self, tempList): maxVal=tempList[0] temp=tempList[0] i=1 while(i<len(tempList)): if temp<0: temp=tempList[i] else: temp+=tempList[i] maxVal=max(temp, maxVal) i+=1 return maxVal def sumOfSubMatrix(self, mat, n): # write code here maxAllVal=-1000000 for i in xrange(n): maxAllVal=max(maxAllVal, self.fun(mat[i])) for j in xrange(i+1, n): for k in xrange(n): mat[i][k]+=mat[j][k] maxAllVal=max(maxAllVal, self.fun(mat[i])) return maxAllVal a=[[-16,-23,-13,-24],[14,-22,28,16],[25,-2,19,-10],[6,9,-17,20]] b=4 #a=[[-6,13,-21,-19],[21,19,5,-22],[-16,10,0,-11],[-15,-4,-8,-15]] print SubMatrix().sumOfSubMatrix(a, b)
C++ 代码:
#include <vector> #include <iostream> using namespace std; class SubMatrix { public: int sumOfSubMatrix(vector<vector<int> > mat, int n) { int maxVal = -(1<<31); for(int i = 0; i < n; i++){ vector<int> temp = mat[i]; maxVal = max(maxVal,helper(temp)); for(int j = i + 1; j < n; j++){ for(int k = 0; k < n; k++){ temp[k] += mat[j][k]; } maxVal = max(maxVal,helper(temp)); } } return maxVal; } //找出该数组的最大子数组和 int helper(vector<int> &a){ int temp = a[0]; int maxVal = temp; for(int i = 1; i < a.size(); i++){ if(temp < 0){ temp = a[i]; }else{ temp +=a[i]; } if(temp > maxVal){ maxVal = temp; } } return maxVal; } }; int main() { SubMatrix X; vector< vector<int> > mat; vector<int> temp; temp.push_back(-16); temp.push_back(-23); temp.push_back(-13); temp.push_back(-24); mat.push_back(temp); vector<int> temp1; temp1.push_back(14); temp1.push_back(-22); temp1.push_back(28); temp1.push_back(16); mat.push_back(temp1); vector<int> temp2; temp2.push_back(25); temp2.push_back(-2); temp2.push_back(19); temp2.push_back(-10); mat.push_back(temp2); vector<int> temp3; temp3.push_back(6); temp3.push_back(9); temp3.push_back(-17); temp3.push_back(20); mat.push_back(temp3); int n=4; cout<<X.sumOfSubMatrix(mat, n)<<endl; return 0; }
原文:http://www.cnblogs.com/devilmaycry812839668/p/6307531.html