我们如何为n是动态的循环进行N嵌套

how can we do n nested for loops where n is dynamic

本文关键字:循环 嵌套 动态 我们      更新时间:2023-10-16

我已经阅读了以下问题,但没有找到解决问题的方法:

  • C++:嵌套的 for 循环的动态数量(无递归)
  • 嵌套
  • 循环的变量

实际问题陈述是:-

乔布和吉米都在玩数字。约伯给了吉米一个数字数组,并要求他告诉长度为L的非递减序列的最小可能最后一个数字。

输入格式

第一个输入行由一个大小为数组 N 的数字组成。

下一行包含数组的 N 个空格分隔的元素。

下一行包含非递减序列的长度,即 L。

输出格式

您必须打印序列的最小可能最后一个数字,如果没有长度为 L 的非递减序列,则打印 -1

示例输入

7
9 7 2 5 4 11 12
3

示例输出

11

解释

在样本输入中,长度为 L=3 的可能非递减序列是 (9,11,12) 、(7,11,12) 、(2,5,11) 、(2,4,11) 、(2,5,12) 、(2,4,12) 、(2,11,12) 、(5,11,12) 、(4,11,12),序列 (2,5,11)

和 (2,4,11) 的最小最后一个数为 11。因此,答案是11。

我的代码...

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int fact(int y,int x)
    {
    static int temp=0;
    if(temp==x)
    {
        temp=0;
        return 1;
    }
    else
        {
        ++temp;
        return y*fact((y-1),x);
    }
}
int main() {
    int num,randmax,n,s,q,w last=-1, minlast=-1;
    
    cin>>n;
    vector<int> a(n);
    
    for(int i=0;i<n; i++)
        {
        cin>>a[i];
    }
    cin>>s;
    vector<vector<int>> c;
    q=fact(s);
    c.resize(q);
    for(int i = 0 ; i < q ; ++i)
    {
        //Grow Columns by n
        a[i].resize(s);
    }
    w=q;
    randmax=n-1;
    int k=0;
    while(w)
        {
        for(int i=0 ; i<n ; i++){
            
        }
        num=rand()%randmax; // this works perfect as expected
        c[][i]=a[num];
        }
        w--;
    }
    /*for(int i=0;i<n;i++)
        {
        for(int j=i+1;j<n;j++)
            {
            for(int k=j+1;k<n; k++)
                {
                    if((a[i]<=a[j])&&(a[j]<=a[k]))
                        {
                        last=a[k];
                        
                        if(minlast=-1)
                        {
                            minlast=a[k];
                        }
                        if(last<minlast){
                            minlast=last;
                        }
                    }
            }
        }
    }
    */
    cout<<last;
    return 0;
}

'

我会告诉你我试图做什么...我想到通过将它们随机分配到我的一个数组中然后计算它们来映射数据。

我在代码中的某个地方迷路了...请给我一个解决方案...一个很好的解释,就像我有时需要动态嵌套 n 循环类型的东西时陷入困境一样......

此外,如果您在我的代码或算法中进行编辑会更有帮助,这样我就可以了解我的错误在哪里......

提前感谢您的时间...

正如您的链接所指出的答案,您可以使用数组来模拟动态数量的 for 循环 David 在这里给出了一个很好的实现。

不过,对于您给出的实际问题,我认为根本不需要动态数量的 for 循环。该问题是一个标准的非递减子序列问题,略有变化。

#include <iostream>
#include <fstream>
int N, L;
int arr[100], seq[100];
int bst;
int main() {
    std::ifstream file ("c.txt");
    file >> N;
    for(int n = 0; n < N; ++n)
        file >> arr[n];
    file >> L;
    file.close();
    bst = 1e9;
    for(int i = 0; i <= N; ++i) seq[i] = 1e9;
    for(int i = 0; i < N; ++i)
    {
        int x = 0;
        while(seq[x] < arr[i]) ++x;
        seq[x] = arr[i];
        if(x + 1 >= L) 
            bst = std::min(bst, arr[i]);
    }
    std::cout << bst << std::endl;
    return 0;
}

此代码应该可以解决您的问题。第一部分执行标准解析和初始化。其余的是LIS问题的变体,它有几个标准算法来解决它。在这里,我们只是检查每当我们扩展长度为 L 或更长的数组时,我们会看到该元素是否小于我们的电流。