HDU1051 WoodenStricks (贪心+DP)

本文介绍了一种结合贪心算法与动态规划求解单调递增子序列问题的方法。通过排序与标记已使用的元素来逐步构建最长递增子序列,最终输出所需处理的木棒数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解题思路:(贪心算法 + 动态规划——单调递增子序列)

 

1.首先将木棒排序,总体为l递增排序,若l相等,则w递增。

2.对第i个木棒处理:选出单调递增子序列,并将单调递增子序列标记为1(使用过)。选出后,时间+1.进行第i+1个木棒的处理

参考了@飘过的小牛的解题思路 ,附我自己的代码。不懂请看这篇博文http://blog.youkuaiyun.com/niushuai666/article/details/6419922

#include <iostream>
#include <algorithm>
#include <cstring>
typedef struct
{
    int l,w;
} wood;

using namespace std;
bool cmp(wood a,wood b)
{
    if(a.l==b.l) return a.w<b.w;
    else return a.l<b.l;
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n;
        cin>>n;
        wood W[5005],last;
        int used[5005];
        memset(used,0,sizeof(used));
        for(int i=0; i<n; i++)
            cin>>W[i].l>>W[i].w;
        sort(W,W+n,cmp);
        int cnt=0;
        for(int i=0; i<n; i++)
        {
            last.w=W[i].w;
            if(!used[i])
            {
                for(int j=i+1; j<n; j++)
                    if(!used[j]&&last.w <= W[j].w )
                    {
                        used[j]=1;
                        last.w=W[j].w;
                    }
                cnt++;
            }
        }
        cout<<cnt<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值