干货



题目练习
条件前缀和

cpp
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int p,a[100000010],dp[100000010];
int main()
{
cin>>p;
for(int i = 0;i<p;i++)
{
cin>>a[i];
}
dp[0] = 0;
for(int i = 1;i<=p;i++)//构建前缀和数组
{
dp[i] = dp[i-1];
if(a[i-1]>0) dp[i]+= a[i-1];//题目要求只算正数
}
int x;
cin>>x;
while(x--)
{
int n,m;
cin>>n>>m;
cout<<dp[m]-dp[n-1]<<endl;
}
return 0;
}
最大子矩阵和

cpp
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n,m;
int a[1010][1010];
int p[1011][1011];
int main()
{
cin>>n>>m;
for(int i = 0;i<n;i++)
{
for(int j = 0;j<m;j++)
{
cin>>a[i][j];
}
}
for(int i = 0;i<=n;i++) p[i][0] = 0;
for(int i = 0;i<=m;i++) p[0][i] = 0;
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=m;j++)
{
p[i][j] = p[i-1][j]+p[i][j-1]+a[i-1][j-1]-p[i-1][j-1];
}
}
int ma = -999999999;
int max1,max2,may1,may2;
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=m;j++)
{
for(int k = i;k<=n;k++)
{
for(int l = j;l<=m;l++)
{
int sum = p[k][l]-p[i-1][l]-p[k][j-1]+p[i-1][j-1];
if(sum>=ma)
{
max1 = i,max2 = k,may1 = j,may2 = l;
ma = sum;
}
}
}
}
}
for(int i = max1-1;i<=max2-1;i++)
{
for(int j = may1-1;j<=may2-1;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
cout<<ma;
return 0;
}
统计全1子矩阵

cpp
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n,m;
int a[1010][1010];
int p[1011][1011];
int main()
{
cin>>n>>m;
for(int i = 0;i<n;i++)
{
for(int j = 0;j<m;j++)
{
cin>>a[i][j];
}
}
for(int i = 0;i<=n;i++) p[i][0] = 0;
for(int i = 0;i<=m;i++) p[0][i] = 0;
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=m;j++)
{
p[i][j] = p[i-1][j]+p[i][j-1]+a[i-1][j-1]-p[i-1][j-1];
}
}
int cnt = 0;
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=m;j++)
{
for(int k = i;k<=n;k++)
{
for(int l = j;l<=m;l++)
{
int sum = p[k][l]-p[i-1][l]-p[k][j-1]+p[i-1][j-1];
if(sum==(k-i+1)*(l-j+1)) cnt++;
}
}
}
}
cout<<cnt;
return 0;
}