我正在编写一个程序,试图找到k> 1的最小值,使得a和b的kth根(它们都被给定)等于整数.
这是我的代码片段,我已经评论澄清了.
int main()
{
// Declare the variables a and b.
double a;
double b;
// Read in variables a and b.
while (cin >> a >> b) {
int k = 2;
// We require the kth root of a and b to both be whole numbers.
// "while a^{1/k} and b^{1/k} are not both whole numbers..."
while ((fmod(pow(a, 1.0/k), 1) != 1.0) || (fmod(pow(b, 1.0/k), 1) != 0)) {
k++;
}
Run Code Online (Sandbox Code Playgroud)
差不多,我在(a,b)中读到,我从k = 2开始并且增加k直到a和b的第k个根与0 mod 1一致(意味着它们可以被1整除,因此整数) …
我是动态编程的新手,但我正在努力变得更好。我有一本书的练习,它问我以下问题(略有删节):
您要根据集合{1、2、3、4、5、6}中的数字构造长度为N的序列。但是,数字i(i = 1、2、3、4、5、6)的连续放置次数不能超过A [i],其中A是给定的数组。给定序列长度N(1 <= N <= 10 ^ 5)和约束数组A(1 <= A [i] <= 50),可能有多少个序列?
例如,如果A = {1、2、1、2、1、1、2}且N = 2,则意味着您只能有一个连续的1,两个连续的2,一个连续的3,等等。在这里,类似“ 11 ”是无效的,因为它具有两个连续的1,而“ 12”或“ 22”之类的东西都有效。事实证明,这种情况的实际答案是33(共有36个两位数的序列,但是“ 11”,“ 33”和“ 55”都是无效的,给出33)。
有人告诉我,解决此问题的一种方法是使用具有三种状态的动态编程。更具体地说,他们说要保留一个3d数组dp(i,j,k),其中i表示序列中我们当前所在的位置,j表示放置在位置i-1的元素,k表示该元素已在块中重复。他们还告诉我,对于过渡,我们可以将与j不同的每个元素置于i的位置,并且只有在A [j]> k时才能将j放入。
从理论上讲,这对我来说都是有意义的,但是我一直在努力实现这一点。除了初始化矩阵dp之外,我不知道如何开始实际的实现。通常,大多数其他练习都具有在矩阵中手动设置的某种“基本情况”,然后使用循环填充其他条目。
我想我特别困惑,因为这是一个3D阵列。
我在网上读过很多“堆”的定义,也读过CLRS中的定义。网上大部分的定义似乎都说堆是完全二叉树;但是,CLRS 使用以下句子开始堆章节:
(二叉)堆数据结构是一个数组对象,我们可以将其视为几乎完整的二叉树......
我不知道为什么,但 CLRS 称堆“几乎完整”,而我读过的几乎所有其他“堆”定义都称堆“完整”,这确实让我感到困扰。
这引出了以下问题:是否有可能有一个不是完整二叉树的堆?