给定一个正整数数组。对于数组的每个元素 x,我们需要找到定义为F(x) = F(floor(x/2)) + x的连续楼层函数的值,其中 F(0) = 0。
例子 :-
Input : arr[] = {6, 8}
Output : 10 15
Explanation : F(6) = 6 + F(3)
= 6 + 3 + F(1)
= 6 + 3 + 1 + F(0)
= 10
Similarly F(8) = 15
基本方法:对于给定的 x 值,我们可以使用简单的递归函数计算 F(x):
int func(int x)
{
if (x == 0)
return 0;
return (x + func(floor(x/2)));
}
在这种方法中,如果我们有 n 个查询,那么每个查询元素都需要 O(x)
一种有效的方法是使用记忆化我们构造一个数组,该数组保存 x 的每个可能值的 F(x) 值。如果尚未计算,我们计算该值。否则我们返回值。
C++
// C++ program for finding value
// of continuous floor function
#include
#define max 10000
using namespace std;
int dp[max];
void initDP()
{
for (int i = 0; i < max; i++)
dp[i] = -1;
}
// function to return value of F(n)
int func(int x)
{
if (x == 0)
return 0;
if (dp[x] == -1)
dp[x] = x + func(x / 2);
return dp[x];
}
void printFloor(int arr[], int n)
{
for (int i = 0; i < n; i++)
cout << func(arr[i]) << " ";
}
// Driver code
int main()
{
// call the initDP() to fill DP array
initDP();
int arr[] = { 8, 6 };
int n = sizeof(arr) / sizeof(arr[0]);
printFloor(arr, n);
return 0;
}
Java
// Java program for finding value
// of continuous floor function
class GFG
{
static final int max = 10000;
static int dp[] = new int[max];
static void initDP()
{
for (int i = 0; i < max; i++)
dp[i] = -1;
}
// function to return value of F(n)
static int func(int x)
{
if (x == 0)
return 0;
if (dp[x] == -1)
dp[x] = x + func(x / 2);
return dp[x];
}
static void printFloor(int arr[], int n)
{
for (int i = 0; i < n; i++)
System.out.print(func(arr[i]) + " ");
}
// Driver code
public static void main(String[] args)
{
// call the initDP() to fill DP array
initDP();
int arr[] = {8, 6};
int n = arr.length;
printFloor(arr, n);
}
}
// This code is contributed by Anant Agarwal.
Python3
# Python3 program for finding value
# of continuous floor function
max = 10000
dp = [0] * max
# function to initialize the DP array
def initDP() :
for i in range(max) :
dp[i] = -1
# function to return value of F(n)
def func(x) :
if (x == 0) :
return 0
if (dp[x] == -1) :
dp[x] = x + func(x // 2)
return dp[x]
def printFloor(arr, n) :
for i in range(n) :
print(func(arr[i]), end = " ")
# Driver Code
if __name__ == "__main__" :
# call the initDP() to
# fill DP array
initDP()
arr = [8, 6]
n = len(arr)
printFloor(arr, n)
# This code is contributed by Ryuga
C#
// C# program for finding value
// of continuous floor function
using System;
class GFG
{
static int max = 10000;
static int []dp = new int[max];
static void initDP()
{
for (int i = 0; i < max; i++)
dp[i] = -1;
}
// function to return value of F(n)
static int func(int x)
{
if (x == 0)
return 0;
if (dp[x] == -1)
dp[x] = x + func(x / 2);
return dp[x];
}
static void printFloor(int []arr, int n)
{
for (int i = 0; i < n; i++)
Console.Write(func(arr[i]) + " ");
}
// Driver code
public static void Main()
{
// call the initDP() to fill DP array
initDP();
int []arr = {8, 6};
int n = arr.Length;
printFloor(arr, n);
}
}
// This code is contributed by nitin mittal
PHP
Javascript
输出:
15 10
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。