试题 F: 统计子矩阵

【问题描述】 给定一个 N × M 的矩阵 A,请你统计有多少个子矩阵 (最小 1 × 1,最大 N × M) 满足子矩阵中所有数的和不超过给定的整数 K?

【输入格式】 第一行包含三个整数 N, M 和 K. 之后 N 行每行包含 M 个整数,代表矩阵 A.

【输出格式】 一个整数代表答案。

【样例输入】 3 4 10 1 2 3 4 5 6 7 8 9 10 11 12

【样例输出】 19

【样例说明】 满足条件的子矩阵一共有 19,包含: 大小为 1 × 1 的有 10 个。 大小为 1 × 2 的有 3 个。 试题 F: 统计子矩阵 8  大小为 1 × 3 的有 2 个。 大小为 1 × 4 的有 1 个。 大小为 2 × 1 的有 3 个。

【评测用例规模与约定】 对于 30% 的数据,N, M ≤ 20. 对于 70% 的数据,N, M ≤ 100. 对于 100% 的数据,1 ≤ N, M ≤ 500; 0 ≤ Ai j ≤ 1000; 1 ≤ K ≤ 250000000

第一次循环为确定该分区的的行起点,第2次循环是确定地该分区的列起点,第三行为确定该分区该行起点的行范围,第4行为确定该分区该列起点的列范围。

#include <iostream>

using namespace std;
long long data1[10000][10000];
int n,m;
long long k;
long long temp[100000];
int index1=0;
long long length1=0;
void duyuk(int x,int y)
{
    index1=0;
    for(int k=1; k+x-1<=n; k++)
    {
        for(int i=1; i+y-1<=m; i++)
        {
            for(int l=k; l<=k+x-1; l++)
            {
                for(int j=i; j<=i+y-1; j++)
                {
                    temp[length1]=temp[length1]+data1[l][j];
                }
            }
            length1++;
        }
    }
}
int main()
{
    cin>>n>>m>>k;
    long long sum=0;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            cin>>data1[i][j];
        }
    }
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            duyuk(i,j);
        }
    }
    for(int i=0; i<length1; i++)
    {
        if(temp[i]<=k&&temp[i]!=-1)
        {
            sum++;
        }
    }
    cout<<sum<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值