当前位置: 首页 > 知识库问答 >
问题:

基于分治技术的最小子向量尺寸k

堵飞鸿
2023-03-14

早上好,我有问题要解决:

我做了如下,但我有基本情况和返回最小和子向量的问题。


// Function to find the minimum between two numbers
int min(int a, int b) { return (a < b)? a : b; }

// Function to find the minimum between three numbers
int min(int a, int b, int c) { return min(min(a, b), c); }

// Function to find the minimum sum that passes through the center of the vector
int minSumCenter(int v[], int l, int center, int h)
{

    // Elements to the left of the center
    int sum = 0;
    int left_sum = INT_MAX;
    for (int i = center; i >= l; i--)
    {
        sum = sum + v[i];
        if (sum < left_sum)
          left_sum = sum;
    }

    // Elements to the right of centre
    sum = 0;
    int right_sum = INT_MAX;
    for (int i = center+1; i <= h; i++)
    {
        sum = sum + v[i];
        if (sum < right_sum)
          right_sum = sum;
    }

    // Return de los elementos que están tanto a la izquierda como a la derecha
    return left_sum + right_sum;
}

// Minimum sum sub-vector size m, size v is h-l
int subvectorMinDyV(int v[], int l, int h, int m){
   // Base Case 1
   if ((h-l) <= m) {
       int sum = 0;
       for(int i=0; i<m; i++)
        sum += v[i];
       return sum;
  // Base Case 2
}else if(m*2-1 <= (h-l)){
       int sum=0;
       int sumMin = INT_MAX;
       for(int i=0; i<(l+h)-m;i++){
           sum=0;
           for(int j=i; j<m; j++)
            sum += v[j];

           if(sum < sumMin)
            sumMin = sum;
       }
       return sumMin;
   }


   int center = (l + h)/2;
   /* Possible cases
      a) minimum sum sub-vector is on the left
      b) minimum sum sub-vector is on the right
      c) minimum sum sub-vector is a in the middle */
   return min(subvectorMinDyV(v, l, center, m),
              subvectorMinDyV(v, center+1, h, m),
              minSumCenter(v, l, center, h));
}

int main(){
   int v[] = {6,10,4,2,14,1};
   int n = sizeof(v)/sizeof(v[0]);
   int sumMin = subvectorMinDyV(v, 0, n-1, 3);
   cout << "The minimum amount with DyV is: " << sumMin << endl;

   return 0;
}

非常感谢。

共有1个答案

公西岳
2023-03-14

如果你观察你的例子,那么你会发现数组是如何分区的。

for n = 6, m = 3

v = 6|10|4|2|14|1
    ---------------
p = 0|1 |2|3|4 |5

g1: 0 1 2
g2: 1 2 3 (1 2 sum already calculated)
g3: 2 3 4 (2 3 sum already calculated)
g4: 3 4 5 (3 4 sum already calculated)

当你从左到右,收集了m个元素后,你需要减去c-m第1个位置元素。其中C`为当前位置

    void subvectorMin(int* v, int n, int m, int p, int sum){

    if (p >= n) {
    return sum;
    }
int tmp = sum - v[p-m]+ v[p];
    return Min(sum, Min(tmp, subvector(v, n, m, p+1, tmp)));
    }

main() {
for (i = 0; i < m; i++) 
sum += v[i];
    subvectorMin(v, n, m, m,sum);
 类似资料:
  • 请在下面找到我的日志4。滚动文件追加器的xml配置 问题是com引用了instrumentationAppender、debugAppender和errorAppender。实践上述类别中定义的pakaage。在所有Appender中,maxFileSize为100kb,并配置为测试。日志文件。问题测试。日志文件在大小为100kb后不会得到滚动。所有日志只是附加到同一个测试中。日志文件。如何根据大

  • 问题内容: 我对(N,)维数组和(N,1)维数组之间的转换有疑问。例如,y是(2,)维。 但是下面将显示y2为(2,1)维。 在不复制的情况下将y2转换回y的最有效方法是什么? 谢谢汤姆 问题答案: 为此工作 还请注意,除非需要复制新形状(在这里不需要这样做),否则它不会复制数据:

  • 问题内容: 我正在尝试根据元素的(100%)高度使用宽度大小制作一个响应式正方形。我相信仅使用CSS是不可能的。 正方形宽度应等于高度(大型容器的100%。大型容器大于屏幕的100%)。该比例必须为width = height才能保持正方形。 问题答案: 好的,这里的解决方案。

  • 对于我在Java中创建的GUI应用程序,我有以下内容: 一个JFrame,设置为最小大小为(300,200) 一个JSplitPane,其中包含: 在左侧,最小大小为(100,0)的JScrollPane(包含JTree)(我只想将宽度限制为200) 在右边,一个最小大小为(200,0)的JPanel 在以下情况下,尺寸不会给我带来任何问题: 向左调整JSplitPane的大小(到JScrollP

  • 这是我的家庭activity代码,当我运行它,它只是一个小尺寸的方框图,所有的内容都压缩在一个ver小图表。请帮助我如何使我的图表更大

  • 我的第一个Android应用程序。而且,我正在努力解决这个问题- 然后我放了一个十美分硬币。xml 唷!但这还不够。我想有不同的文本大小(和其他尺寸,我不在这里谈论图像)的手机 下面是我正在做的一个例子: 然后在迪蒙斯。xml,应该是:17 这个值,即这里的17,将在每个设备中不同,即它在每个值文件夹下的每个dimens.xml中被赋予不同的值。我希望是清楚的。