该题第一思路是暴力解决
即枚举所有可能的子矩阵,然后对符合要求的矩阵进行计数即可
下面我是利用了一点前缀和的思想进行处理,这里利用前缀和求出我们枚举的矩阵的内部之和,不懂前缀和的同学可翻看之前的文章
#include<iostream> #include<cstring> #define MAX 505 using namespace std; int arr[MAX][MAX]; int n,m,k,ans=0; int main(){ cin>>n>>m>>k; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>arr[i][j]; arr[i][j]+=arr[i-1][j]+arr[i][j-1]-arr[i-1][j-1]; } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){//枚举左上角 for(int p=i;p<=n;p++){//枚举右下角 for(int q=j;q<=m;q++){ int temp=arr[p][q]-arr[p][j-1]-arr[i-1][q]+arr[i-1][j-1];//二维前缀和 if(temp<=k){ ans++; } } } } } cout<<ans<<endl; return 0; }
不过该思路由于用到了四重循环因此时间复杂度较高并不能通过所有样例
[蓝桥杯 2022 省 B] 统计子矩阵
于 2023-04-01 15:08:14 首次发布