zoj1025 Wooden Sticks

DAG转移,从切题的数量来看是一道水题,给你n个棒,大的可以延续小的,问最少上升子序列的个数。

其实这道题是用贪心来写的,因为这是个有向无环图,到达分叉口,每一条路都要便历,所以每条路应该一样对待,有两维限制,可以先对其中一维进行排序,然后根据第二维的情况进行处理。

for循环:

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
using namespace std;
int n;
struct node
{
int u,v;
}big[];
bool vis[];
bool cmp(node a,node b)
{
if(a.u<b.u)
return ;
else if(a.u==b.u&&a.v<b.v)
return ;
return ;
}
int main()
{
//freopen("input.txt","r",stdin);
int cas;
cin>>cas;
while(cas--)
{
cin>>n;
for(int i=;i<n;i++)
{
cin>>big[i].u>>big[i].v;
}
sort(big,big+n,cmp);
int ans=;
int t=;
memset(vis,,sizeof(vis));
for(int i=;i<n;i++)
{
if(vis[i])
continue;
vis[i]=;
t=big[i].v;
ans++;
for(int j=i+;j<n;j++)
{
if(big[j].v>=t&&vis[j]==)
{
t=big[j].v;
vis[j]=;
}
}
}
printf("%d\n",ans);
}
}

记忆化dfs贪心:

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
using namespace std;
int n;
struct node
{
int u,v;
}big[];
bool vis[];
bool cmp(node a,node b)
{
if(a.u<b.u)
return ;
else if(a.u==b.u&&a.v<b.v)
return ;
return ;
}
void dfs(int x)
{
if(vis[x])
return;
vis[x]=;
for(int j=x+;j<n;j++)
{
if(vis[j]==&&big[j].v>=big[x].v)
{
dfs(j);
break;//记忆化贪心的时候要加上break;
}
}
} int main()
{
//freopen("input.txt","r",stdin);
int cas;
cin>>cas;
while(cas--)
{
cin>>n;
for(int i=;i<n;i++)
{
cin>>big[i].u>>big[i].v;
}
sort(big,big+n,cmp);
int ans=;
memset(vis,,sizeof(vis));
for(int i=;i<n;i++)
{
if(!vis[i])
{
dfs(i);
ans++;
}
}
printf("%d\n",ans);
}
}
上一篇:attachEvent和addEventListener


下一篇:20155201 2016-2017-2 《Java程序设计》第九周学习总结