紫书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上的最短路径。
- 用拓扑排序+动态规划的方法输出DAG的所有可能的路径
- DAG上的动态规划(嵌套矩形)
- DAG上的动态规划--嵌套矩形
- 矩形嵌套-DAG上的动态规划
- nyoj16矩形嵌套(DAG上的动态规划)
- DAG上的动态规划之嵌套矩形
- nyoj 16 嵌套矩形(DAG上的动态规划)
- 嵌套矩形——DAG上的动态规划
- DAG上的动态规划 - 算法竞赛入门经典 - 嵌套矩形问题
- ACM:DAG上的动态规划------嵌套矩形
- 嵌套矩形——DAG上的动态规划
- nyoj-16 矩形嵌套 (DAG上的动态规划,记忆化搜索)
- NYOJ 16 矩形嵌套(DAG上的动态规划)
- nyoj 16 矩形嵌套 (DAG上的动态规划)
- 矩形嵌套 ————DAG(有向无环图)上的动态规划
- 矩形嵌套(最小字典序)—DAG动态规划问题
- 动态规划——矩形嵌套问题
- #DP基础题#嵌套矩形(输出路径)
- 动态规划——矩形嵌套问题