51nod 1051最大子矩陣和
阿新 • • 發佈:2020-12-02
題面:
為一維欄位和最大值的二維拓展版;
考慮固定右下端點(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=1View Code;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; }