度小满笔试

2020.04.20 度小满后端笔试第一题

/**
 * 1、题目描述:
 * 在机器学习中有一种流行的池化操作,而在池化操作中,3*3极大值池化应用十分广泛。什么是3*3极大值池化呢?设原矩阵是n*m的,
 则3*3极大值池化就是枚举矩阵中的所有3*3的子矩阵,分别求最大值并顺次拼接而成,处理过后的矩阵是(n-2)*(m-2)。
 *
 * 例如,原矩阵是[[1,2,3,4],[5,6,7,8],[9,10,11,12]],经过池化之后就变成[[11,12]]。
 *
 * 为了提高难度,选择的滑动窗口并不是3*3的,而是a*b的,由于输入可能是非常大的,原n*m的矩阵权值由以下公式计算得到,h(i,j)=i*j mod 10。(1<=i<=n,1<=j<=m)
 *
 * 由于输出矩阵也是一个很麻烦的事情,因此你只需输出经过a*b池化处理后的矩阵的元素之和即可。
 *
 * 输入
 * 输入第一行包含四个正整数,n,m,a,b,分别表示原矩阵的行列数量和滑动窗口的行列数量。(1<=n,m,a,b<=1000)
 *
 * 输出
 * 输出仅包含一个整数,即新矩阵的元素之和。
 *
 *
 * 样例输入
 * 4 5 3 3
 * 样例输出
 * 54
 */
import java.util.Scanner;

public class 度小满1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        String[] s1 = s.split(" ");
        int n = Integer.parseInt(s1[0]);
        int m = Integer.parseInt(s1[1]);
        int a = Integer.parseInt(s1[2]);
        int b = Integer.parseInt(s1[3]);

        //生成输入矩阵
        int[][] arr = new int[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                arr[i][j] = (i+1)*(j+1)%10;
            }
        }

        //计算输出矩阵元素的和
        int sum = 0;
        for (int i = 0; i <= n-a; i++) {
            for (int j = 0; j <= m-b; j++) {
                sum += max(arr,a,b,i,j);
            }
        }
        System.out.println(sum);
    }

    public static int max(int[][] arr,int a,int b,int i,int j){
        int temp = 0;
        for (int k = i; k < a+i; k++) {
            for (int l = 0; l < b+j; l++) {
                if (arr[k][l] > temp){
                    temp = arr[k][l];
                }
            }
        }
        return temp;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值