To the Max
阿新 • • 發佈:2017-09-24
sum 兩個 題意 最大子矩陣 表示 cnblogs 坐標 namespace +=
題意:求最大子矩陣的和
題解:一維的最大子段和擴展到二維(一直想著取矩陣的左上和右下兩個頂點,然後壓縮成一維,。。。真是傻)。在腦海中建立一個坐標系,然後把矩陣放
進去,它的子矩陣相當於沿著y軸方向的某個連續子段,只是這個子段的寬度需要枚舉。然後令map[ i ][ j ]表示第 i 行 1~j 列的前綴和,就可以用一維的方式處理了。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std;6 7 const int INF=1e8; 8 9 int n; 10 int map[105][105]; 11 12 void Inite(){ 13 for(int i=1;i<=n;i++) map[i][0]=0; 14 for(int i=1;i<=n;i++){ 15 for(int j=1;j<=n;j++){ 16 cin>>map[i][j]; 17 map[i][j]+=map[i][j-1]; 18 } 19 } 20 } 21 22void Solve(){ 23 int ans=-INF; 24 for(int i=1;i<=n;i++){ 25 for(int j=i;j<=n;j++){ 26 int sum=0; 27 for(int k=1;k<=n;k++){ 28 if(sum<0) sum=0; 29 sum=sum+map[k][j]-map[k][i-1]; 30 ans=max(ans,sum); 31 }32 } 33 } 34 cout<<ans<<endl; 35 } 36 37 int main() 38 { while(cin>>n){ 39 Inite(); 40 Solve(); 41 } 42 return 0; 43 }
To the Max