私信TA
用户名:dotcpp0598211
访问量:1674
签 名:
自我简介:
作者: 快乐在明天 发表时间:2023-04-02 10:46:51 浏览:61 | 评论:0
解题思路: 双指针加二维数组前缀和注意事项:参考代码:
//原始做法 纯暴力
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=1e3+5;
int g[N][N],s[N][N];
int n,m,x;
int maxn=-128;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>g[i][j];
//二维数组前缀和处理 s数组记录二维数组前缀和
s[i][j]=g[i][j]+s[i][j-1]+s[i-1][j]-s[i-1][j-1];
}
ll sum=0;
//利用两个双指针 用j指向i控制行的变化 用r指向l控制列的变化
//画图理解,相当于看区域(i,l)到(j,r)的前缀和是否小于等于x,如果
//满足则说明该矩阵符合条件,矩阵大小为(j-i)*(r-l)
//这样可以得到满足条件的矩阵的大小和个数(大小从n*m到1*1)
for(int j=i;j<=n;j++)
for(int l=1;l<=n;l++)
for(int r=l;r<=n;r++)
//i和j控制着矩阵的宽,l和r控制矩阵的长,相当于求
//(i,l)到(j,r)的前缀和,通过遍历所有矩阵的大小,来
//筛选符合条件的矩阵大小个数
sum=s[j][r]-s[i-1][r]-s[j][l-1]+s[i-1][l-1];
if(maxn<sum)
maxn=sum;
cout<<maxn<<endl;
return 0;
//优化解法,利用前缀列和 和双指针
const int N=1e3+3;
int n;
s[i][j]=s[i-1][j]+g[i][j];
//重点 每次循环前ans都要重置 如果不清0则每次循环都包含重复值
int ans=0;
for(int k=1;k<=n;k++)
ans+=s[j][k]-s[i-1][k];
if(maxn<ans)
maxn=ans;
//如果ans小于0 那么以后ans再加其他数总要减小,所以ans要重置
if(ans<0)
ans=0;
0.0分
0 人评分
看不懂代码解释一下代码? 或者生成一段代码?试试AI编程助手吧