【发布时间】:2018-10-05 08:30:45
【问题描述】:
我得到一个 NxN 矩阵。如果满足以下条件,则认为子矩阵是特殊的:
- 必须是正方形
- 所有数字都必须是素数。
我必须计算给定矩阵中满足以下条件的子矩阵的总数。
例如,让样本输入为=>
3
3 5 6
8 3 2
3 5 2
样本输出:8
解释:
- 1x1:有 7 个素数,每个 1x1 矩阵包含 1 个素数
- 2x2:只有右下子矩阵包含所有素数
- 3x3:没有 3x3 矩阵满足这些条件
所以最后的答案是 (7+1+0)=8
我最近在一次采访中遇到了这个问题。我可以想出一个蛮力解决方案。解决这个问题的最佳方法是什么?
[更新] 我已经粘贴了解决问题的尝试。
class TestClass
{
public static boolean isPrime(int n)
{
if(n<2)
return false;
for(int i=2;i<=Math.sqrt(n);i++)
{
if(n%i==0)
return false;
}
return true;
}
public static boolean scan_matrix(boolean a[][], int start_i, int start_j, int n)
{
for(int i=start_i;i<start_i+n;i++)
{
for(int j=start_j;j<start_j+n;j++)
{
if(!a[i][j])
return false;
}
}
return true;
}
public static int count_valid_matrix(boolean a[][], int n, int N)
{
int result = 0;
for(int start_i=0;start_i<=N-n;start_i++)
{
for(int start_j=0;start_j<=N-n;start_j++)
{
if(scan_matrix(a, start_i, start_j, n))
result += 1;
}
}
return result;
}
public static void main(String args[]) throws Exception
{
Scanner s = new Scanner(System.in);
int N = s.nextInt();
boolean a[][] = new boolean[N][N];
int result = 0;
for(int i=0;i<N; i++)
{
for(int j=0;j<N;j++)
{
int num = s.nextInt();
a[i][j] = isPrime(num);
if(a[i][j])
result += 1;
}
}
int n = 2;
while(n<N)
{
result += count_valid_matrix(a, n, N);
n++;
}
System.out.println(result);
}
}
【问题讨论】:
-
你能展示一下你的尝试吗?
-
看起来很适合动态规划算法。 2x2 矩阵实际上是 4 个彼此相邻的 1x1 矩阵,这意味着从根本上说,如果您解决较小矩阵的问题并保存相关信息,它应该会建立起来。
-
提示 1:每个 2x2 子矩阵包含四个 1x1 子矩阵。每个 3x3 子矩阵包含四个 2x2 子矩阵。提示 2:Sieve of Eratosthenes
标签: java algorithm matrix dynamic-programming