POJ:1050 To The Max

题目链接

题意:

N*N的矩阵,求出最大的子矩阵的和

题解:

最大子段和的扩展应用,最大子段和即求出一个序列中最大的连续子段的和,动态规划,dp[i]即以序列a[i]为结尾的子序列的和

dp[i]=max(dp[i-1]+a[i],a[i])

最大子矩阵求解,将最大子矩阵转变为一维的最大子段和,即对每一行i到行j求解以列和为序列的最大子段和

0 -2 -7 0

9 2 -6 2

-4 1 -4 1

-1 8 0 2

行0到行3,则序列为5 1 -17 3,则最大子序列和为6,最大子矩阵为

0 -2

9  2

-4 1

即列举所有起始行到终止行的序列组合,求每个组合的最大子序列和,则最大的即为结果

#include<iostream>
#include<cstring>
using namespace std;
#define N 110
int a[N][N];
int b[N];
int main(){
    int r;
    cin>>r;
    for(int i=1;i<=r;++i)
        for(int j=1;j<=r;++j)
        {
            cin>>a[i][j];
            a[i][j]+=a[i-1][j];//前j列的和
        }
    int max=a[1][1];
    for(int i=0;i<=r-1;++i)
        for(int j=i+1;j<=r;++j)
        {
            memset(b,0,sizeof(b));
            for(int k=1;k<=r;++k)//最大子段和
            {
                if(b[k-1]>=0)
                    b[k]=b[k-1]+a[j][k]-a[i][k];
                else
                    b[k]=a[j][k]-a[i][k];
                if(max<b[k])
                    max=b[k];
            }
        }
    cout<<max<<endl;
}

猜你喜欢

转载自blog.csdn.net/wuzhenzi5193/article/details/81587131
今日推荐