题意就是给一个矩阵中的一些点
从矩阵左上角出发,每次只能往下走和往右走
每次经过该点该点的标记就会消失
问,至少走几次标记会全部消失
偏序集dilworth定理
求一次非往下走和往右走的最长子序列
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
using namespace std;
class coordinate
{
public:
int x,y;
};
vector<coordinate>p;
bool cmp(coordinate a,coordinate b)
{
if(a.x==b.x)
{
return a.y<b.y;
}
else
{
return a.x<b.x;
}
}
bool operator>(coordinate a,coordinate b)
{
return !(a.x<=b.x&&a.y<=b.y);
}
int d[1000];
int main()
{
coordinate tt;
while(scanf("%d%d",&tt.x,&tt.y),tt.x!=-1&&tt.y!=-1)
{
p.clear();
p.push_back(tt);
while(scanf("%d%d",&tt.x,&tt.y),tt.x&&tt.y)
{
p.push_back(tt);
}
sort(p.begin(),p.end(),cmp);
//动态规划求解p数组的最长降序子序列的长度
for(int i=0;i<p.size();i++)
{
d[i]=1;
for(int j=0;j<i;j++)
{
if(d[j]+1>d[i]&&p[j]>p[i])
{
d[i]=d[j]+1;
}
}
}
int ant=0;
for(int i=0;i<p.size();i++)
{
if(ant<d[i])
{
ant=d[i];
}
}
printf("%d\n",ant);
}
return 0;
}