POJ-1050 To the Max(dp)
阿新 • • 發佈:2020-11-06
題目描述
求 \(n\) 行 \(n\) 列矩陣的最大子矩陣(\(1\leq n\leq 100,-127\leq a_{ij}\leq 127\))。
分析
經典題。
預處理每行的字首和,然後列舉每行的起點 \(i\) 和終點 \(j\),最內層列舉行號 \(k\),更新答案即可,時間複雜度 \(O(n^3)\)。
程式碼
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int INF=0x3f3f3f3f; int a[110][110],sum[110][110]; int main() { int n; cin>>n; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cin>>a[i][j]; sum[i][j]=sum[i][j-1]+a[i][j]; } } int ans=-INF; for(int i=1;i<=n;i++) { for(int j=i;j<=n;j++) { int temp=0; for(int k=1;k<=n;k++) { if(temp<0) temp=0; temp=temp+sum[k][j]-sum[k][i-1]; ans=max(ans,temp); } } } cout<<ans<<endl; return 0; }