#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
const int maxn=1000+5;
int G[maxn][maxn],d[maxn],n,b[maxn],sum=0,path[maxn];//b数组保存起点,sum表示起点有多少个
int dp(int i)
{
int& ans = d[i];
if(ans > 0)
return ans;
ans =1;
for(int j = 1; j <= n; j++)
if(G[i][j])
ans = max(ans, dp(j)+1);
return ans;
}
void print_ans(int i,int k)
{
path[k]=i;
if(d[i]==1)
{
for(int i=0;i<=k;i++)
printf("%d ",path[i]);
printf("\n");
return ;
}
for(int j = 1; j <=n; j++)
if(G[i][j]&&d[i]==d[j]+1)
{
print_ans(j,k+1);
}
}
int main()
{
// freopen("in.txt","r",stdin);
memset(G,0,sizeof(G));
memset(d,0,sizeof(d));
int x[maxn],y[maxn],t,max_sum=0,sub;
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%d %d",&x[i],&y[i]);
if(x[i]<y[i])
{
t=x[i];
x[i]=y[i];
y[i]=t;
}
}
for(int i=1; i<=n; i++)
for(int j=i+1; j<=n; j++)
{
if(x[i]>x[j]&&y[i]>y[j])
G[i][j]=1;
else if(x[i]<x[j]&&y[i]<y[j])
G[j][i]=1;
}
for(int i=1; i<=n; i++)
dp(i);
for(int i=1; i<=n; i++)
{
if(d[i]>max_sum)
{
max_sum=d[i];
sub=i;
}
}
for(int i=1; i<=n; i++)
{
if(d[i]==max_sum)
b[++sum]=i;
}
for(int i=1;i<=sum;i++)
print_ans(b[i],0);
return 0;
}
紫书p263 嵌套矩形如何输出所有路径(DAG上的动态规划)
最新推荐文章于 2021-01-09 19:01:29 发布