Uva - 103 - Stacking Boxes

本文介绍了一道UVA在线评测平台上的算法题,该题要求找到一系列多维向量中最长的相互嵌套路径。通过定义嵌套条件并利用排序和记忆化搜索来解决这个问题。代码中详细展示了从输入处理到动态规划求解的过程。

题意:有k个n维的东东,对于其中的两个,如果其中的一个东东的每一维都大于另一个东东的其中一维,那么就说可以嵌套它,求这k个东东互相嵌套的最长路径。

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=114&problem=39

——>>一个东东能嵌套另一个东东,则其n维元素排序后一定是每一维的元素都比另一个东东n维排序后的每一维元素都要大。

排序,建好图,记忆化搜索一次。

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

struct Box
{
    int demension;
    int e[20];
    bool operator < (const Box& b) const
    {
        for(int i = 1; i <= demension; i++)
            if(e[i] >= b.e[i])
                return 0;
        return 1;
    }
    void boxSort()
    {
        sort(e+1, e+1+demension);
    }
};
int f[40], k;
int G[40][40];
Box box[40];
int dp(int i)
{
    int& ans = f[i];
    if(ans > 0) return ans;
    ans = 1;
    for(int j = 1; j <= k; j++)
        if(G[i][j]==1)
            ans = max(ans, dp(j)+1);
    return ans;
}
void print(int i)
{
    for(int j = 1; j <= k; j++)
        if(G[i][j] && f[i] == f[j]+1)
        {
            printf(" %d", j);
            print(j);
            break;
        }
}
int main()
{
    int n, i, j;
    while(~scanf("%d%d", &k, &n))
    {
        for(i = 1; i <= k; i++)
        {
            for(j = 1; j <= n; j++)
            {
                scanf("%d", &box[i].e[j]);
                box[i].demension = n;
            }
            box[i].boxSort();
        }
        memset(G, 0, sizeof(G));
        for(i = 1; i <= k; i++)     //建图
            for(j = 1; j <= k; j++)
                if(box[i] < box[j]) G[i][j] = 1;
        memset(f, 0, sizeof(f));

        for(i = 1; i <= k; i++) dp(i);      //dp求解

        int id = 1;
        for(i = 2; i <= k; i++)     //找最长路
            if(f[i] > f[id])
                id = i;
        printf("%d\n", f[id]);
        printf("%d", id);
        print(id);
        printf("\n");
    }
    return 0;
}



### LightGBM-LSTM Stacking 集成方法分析 #### 优点 Stacking 作为一种层次化的集成学习方法,能够有效融合 LightGBM 和 LSTM 这类不同建模范式的模型。LightGBM 擅长处理结构化数据,具备高效、低内存消耗和快速训练的优势,而 LSTM 在处理时间序列依赖关系方面表现优异,适用于具有时序特性的任务。通过将这两种模型的预测结果作为输入特征,训练一个元学习器(如随机森林、逻辑回归等),可以进一步提升模型的泛化能力和预测精度。这种集成方式在多输出回归任务中尤其有效,例如非洲土壤属性预测项目中,就采用了多模型融合策略来提升模型鲁棒性和准确性[^3]。 此外,Stacking 的灵活性在于可以引入多个基模型,并通过元模型自动学习它们的最优组合方式,从而避免手动设定权重所带来的主观偏差。 #### 缺点 尽管 Stacking 在提升模型性能方面表现出色,但也存在一定的局限性。首先,模型复杂度显著增加,不仅需要训练多个基模型,还需额外训练元学习器,导致计算资源消耗较大。尤其在 LightGBM 与 LSTM 并行训练时,由于 LSTM 的训练周期较长,整体训练时间可能显著增加。其次,Stacking 对数据划分和元模型选择敏感,若训练集划分不均或元模型选择不当,可能导致过拟合或泛化能力下降[^1]。 此外,Stacking 的超参数调优过程更为复杂,例如基模型的参数、元模型的学习率、特征组合方式等,均需进行系统优化,增加了模型调参的难度。 #### 应用场景 LightGBM-LSTM Stacking 集成方法适用于结构化数据与时间序列数据混合的任务。例如在工单分配、设备故障预测等场景中,数据可能同时包含静态特征(如设备型号、历史故障次数)和动态特征(如传感器时序数据)。通过 LightGBM 提取静态特征的高阶关系,LSTM 捕捉时序模式,再通过元模型融合两者输出,可有效提升预测准确性。 在非洲土壤属性预测任务中,也采用了类似的多模型融合策略,结合不同回归模型的预测结果,构建出更稳健的预测系统。该方法同样适用于金融预测、工业设备状态监测、智能运维等需要融合多源异构数据的场景。 #### 示例代码:LightGBM-LSTM Stacking 融合 ```python from sklearn.ensemble import RandomForestRegressor import numpy as np # 假设 lightgbm_pred 和 lstm_pred 是两个模型在验证集上的预测结果 X_stack = np.column_stack((lightgbm_pred, lstm_pred)) y_true = test_labels # 使用随机森林作为元学习器 meta_model = RandomForestRegressor() meta_model.fit(X_stack, y_true) final_pred = meta_model.predict(X_stack) ``` 上述代码展示了如何将 LightGBM 和 LSTM 的预测结果进行 Stacking 融合,并使用随机森林作为元学习器提升最终预测性能。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值