1. 程式人生 > 實用技巧 >51nod 1051最大子矩陣和

51nod 1051最大子矩陣和

題面:

為一維欄位和最大值的二維拓展版;

考慮固定右下端點(i,j)然後固定子矩陣的高度為k,那麼就可以轉化為一維的最大欄位和。

空間可以優化到0(n)

時間複雜度o(n^3)

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=510;
ll dp[N],a[N][N];
int main()
{
    int n,m;
    cin>>m>>n;
    for(int i=1;i<=n;i++)
        for(int j=1
;j<=m;j++) scanf("%lld",&a[i][j]),a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1]; ll ans=0; for(int i=1;i<=n;i++) { for(int k=1;k<=i;k++) { dp[k]=0; for(int j=1;j<=m;j++) { ll s=a[i][j]-a[i-k][j]-a[i][j-1
]+a[i-k][j-1]; if(dp[k]>0) dp[k]+=s; else dp[k]=s; //dp[k]=max(dp[k]+s,s); ans=max(ans,dp[k]); } } } cout<<ans<<endl; return 0; }
View Code