给你一个 的方阵,第 行第 列的元素是 中的一个。定义一个矩阵权值为这个矩阵出现的数量的最小值。 现在有一个值 ,现在想请你计算出,有多少个子方阵的矩阵权值不小于 。 一个行数与列数相等的矩阵称为方阵。
区块链毕设网qklbishe.com为您提供问题的解答
给你一个
的方阵,第
行第
列的元素是
中的一个。定义一个矩阵权值为这个矩阵出现的
数量的最小值。
现在有一个值
,现在想请你计算出,有多少个子方阵的矩阵权值不小于
。
一个行数与列数相等的矩阵称为方阵。
// 使用二维前缀和和二分优化即可 #include<array> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 前缀和 * 返回一个整数,表示答案 * @param a int整型vector<vector<>> * @param val int整型 * @return int整型 */ int matrixCount(vector<string>& a, int myval) { // write code here int n = a.size(); vector<vector<array<int, 3>>> dp(n + 1, vector<array<int, 3>>(n+1, {0, 0, 0})); int result = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { // 记录数量 dp[i][j][0] = dp[i - 1][j][0] + dp[i][j - 1][0] - dp[i - 1][j - 1][0]; if (a[i - 1][j - 1] == 'r') dp[i][j][0]++; dp[i][j][1] = dp[i - 1][j][1] + dp[i][j - 1][1] - dp[i - 1][j - 1][1]; if (a[i - 1][j - 1] == 'e') dp[i][j][1]++; dp[i][j][2] = dp[i - 1][j][2] + dp[i][j - 1][2] - dp[i - 1][j - 1][2]; if (a[i - 1][j - 1] == 'd') dp[i][j][2]++; // 二分查找 int left=min(i, j), right = 0; while(left>=right){ int mid = right + (left-right)/2; int r = dp[i][j][0] - dp[i-mid][j][0] - dp[i][j-mid][0] + dp[i-mid][j-mid][0]; int e = dp[i][j][1] - dp[i-mid][j][1] - dp[i][j-mid][1] + dp[i-mid][j-mid][1]; int d = dp[i][j][2] - dp[i-mid][j][2] - dp[i][j-mid][2] + dp[i-mid][j-mid][2]; int min_ = min(r, min(e, d)); if(min_>=myval){ left = mid-1; }else{ right = mid+1; } } result += min(i,j)-left; } } return result; } };
20:37
以上就是关于问题给你一个 的方阵,第 行第 列的元素是 中的一个。定义一个矩阵权值为这个矩阵出现的数量的最小值。 现在有一个值 ,现在想请你计算出,有多少个子方阵的矩阵权值不小于 。
一个行数与列数相等的矩阵称为方阵。的答案
欢迎关注区块链毕设网-
web3一级市场套利打新赚钱空投教程
区块链NFT链游项目方科学家脚本开发培训