zoukankan      html  css  js  c++  java
  • [编程题]最大和子矩阵

    采用动态规划策略,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;
    }
  • 相关阅读:
    浅谈 LCA
    树剖毒瘤题整理
    树链剖分&咕咕咕了好久好久的qtree3
    洛谷P4095新背包问题
    洛谷P4127同类分布
    洛谷P4124 手机号码
    数位dp好题整理+自己wa过的细节记录
    P4999烦(gui)人(chu)的数学作业
    洛谷P4317 花(fa)神的数论题(数位dp解法)
    网络流之最短路径覆盖问题
  • 原文地址:https://www.cnblogs.com/devilmaycry812839668/p/6307531.html
Copyright © 2011-2022 走看看