您的位置:首页 > 其它

紫书p263 嵌套矩形如何输出所有路径(DAG上的动态规划)

2017-10-30 21:42 357 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态规划 DAG