poj1065个人随笔浅谈

本文介绍了一种求解不下降序列个数的方法,通过排序和遍历的方式找到符合条件的序列,采用C++实现,适合初学者理解动态规划之外的解题思路。

这题思路就是求不下降序列的个数。这个挑战程序设计竞赛推荐给我的题目,在动态规划里面。本人刚入门,对dp运用不是特别熟练,这题目一直没思路,也一直在dp的路上想,之后突然发现这题目可以用简单的深度优先搜索完成!大家不要被题目给限制的思路
最开始本人想的是,直接用sort排序,然后在看子序列个数
bool cmp(Wood w1,Wood w2)
{
    return w1.a<w2.a&&w1.b<w2.b;
}
这是本人以前的排序函数,但这种排序会漏掉一些

#include <iostream>
#include<stdio.h>
#include<algorithm>
#define size 5010
using namespace std;
typedef struct
{
    int a;
    int b;
    bool visit;
}Wood;
Wood w[size];
bool cmp(Wood w1,Wood w2)
{
   if(w1.a==w2.a)
    return w1.b<w2.b;
   else
    return w1.a<w2.a;
}
int main()
{
    int T;
    int i=0;
    cin>>T;
    while(i++<T)
    {
        int n;
        cin>>n;
        for(int i=0;i<n;i++)
         {
             scanf("%d%d",&w[i].a,&w[i].b);
             w[i].visit=false;
         }
        sort(w,w+n,cmp);
        int count=0;
        for(int i=0;i<n;i++)
        {
            if(!w[i].visit)
            {
                count++;
                w[i].visit=true;
                int we = w[i].b;
                for(int j=i+1;j<n;j++)
                {
                    if(!w[j].visit)
                    {
                        if(w[j].b>=we)
                        {
                            we = w[j].b;
                            w[j].visit=true;
                        }
                    }
                }
            }
        }
        cout<<count<<endl;
    }
    return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值