这题思路就是求不下降序列的个数。这个挑战程序设计竞赛推荐给我的题目,在动态规划里面。本人刚入门,对dp运用不是特别熟练,这题目一直没思路,也一直在dp的路上想,之后突然发现这题目可以用简单的深度优先搜索完成!大家不要被题目给限制的思路
最开始本人想的是,直接用sort排序,然后在看子序列个数
bool cmp(Wood w1,Wood w2)
{
return w1.a<w2.a&&w1.b<w2.b;
}
{
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;
}
#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;
}
本文介绍了一种求解不下降序列个数的方法,通过排序和遍历的方式找到符合条件的序列,采用C++实现,适合初学者理解动态规划之外的解题思路。
2283

被折叠的 条评论
为什么被折叠?



