给定两个整数n和m ,它们是网格的尺寸。任务是找到按单元绘制网格单元的成本,其中绘制单元的成本等于相邻单元的绘制单元数。如果尚未绘制任何单元格,则可以随时对其进行绘制,从而将绘制网格的成本降至最低。
例子:
Input: n = 1, m = 1
Output: 0
A single cell with no adjacent cells can be painted free of cost
Input: n = 1, m = 2
Output: 1
1st cell will be painted free of cost but the cost of painting the second cell will be 1 as there is 1 adjacent cell to it which is painted
一个简单的解决方案是生成使用n * m个单元格(即n * m!)绘制网格的所有可能方式。计算其中每个的成本。
时间复杂度: O(n * m!)
高效方法:了解此图中的着色过程,而不是网格。因此,单元格的颜色等于图形顶点的颜色。绘制单元格所获得的成本等于该单元的有色邻居的数量。这意味着获得的成本将是当前像元与相邻彩色像元之间的边数。
关键要注意的是,在所有单元格着色结束后,将标记图形的所有边缘。
一个有趣的事实是,图形的边缘仅被标记了一次。这是因为边缘连接两个单元。当两个单元都被绘制时,我们标记该单元。我们不允许一个单元绘制多于一次,以确保我们仅标记每个单元一次。
因此,无论您对单元进行着色的顺序如何,标记边缘的数量均保持不变,因此成本也将相同。
对于给定的网格,边的数量将为n *(m – 1)+ m *(n – 1) 。这是因为每一行都由m – 1个边组成,而每一列则由n – 1个边组成。
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
// Function to return the minimum cost
int getMinCost(int n, int m)
{
int cost = (n - 1) * m + (m - 1) * n;
return cost;
}
// Driver code
int main()
{
int n = 4, m = 5;
cout << getMinCost(n, m);
return 0;
}
Java
// Java implementation of the approach
class gfg
{
// Function to return the minimum cost
static int getMinCost(int n, int m)
{
int cost = (n - 1) * m + (m - 1) * n;
return cost;
}
// Driver code
public static void main(String[] args)
{
int n = 4, m = 5;
System.out.println(getMinCost(n, m));
}
}
// This code is contributed by Code_Mech.
Python3
# Python3 implementation of the approach
# Function to return the minimum cost
def getMinCost(n, m):
cost = (n - 1) * m + (m - 1) * n
return cost
# Driver code
if __name__ == "__main__":
n, m = 4, 5
print(getMinCost(n, m))
# This code is contributed by
# Rituraj Jain
C#
// C# implementation of the approach
using System;
class GFG
{
// Function to return the minimum cost
static int getMinCost(int n, int m)
{
int cost = (n - 1) * m + (m - 1) * n;
return cost;
}
// Driver code
public static void Main()
{
int n = 4, m = 5;
Console.WriteLine(getMinCost(n, m));
}
}
// This code is contributed
// by Akanksha Rai
PHP
31