题目大意:矩阵嵌套,不过维数是多维的。有两个个k维的盒子A(a1, a1...ak), B(b1, b2...bk),若能找到(a1...ak)的一个排列使得a< bi,则盒子A可嵌套在盒子B中。给出n个k维的盒子,找出最长的可嵌套的盒子的序列。实际上是DAG上的动态规划问题。首先是判断A能否嵌套在B中,对盒子的k维数进行排序,依次比较即可。然后用d[i]表示以节点i为起点的最长路径的长度,可以得到状态转移方程:d(i) = max{d(j)+1}, (i,j)是图上的一条边。最后就是打印路径,根据转移方程递归打印路径即可。

 #include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define BOXN 35
#define DIMENSION 12 int k, n; // k is the number of boxes, n is the dimensionality
int box[BOXN][DIMENSION], d[BOXN]; // d[i] save the number of nodes in the longest path starting with node i
int G[BOXN][BOXN]; bool is_nested(int *box1, int *box2)
{
// if box1 can be nested in box2, return true; otherwise false
for (int i = ; i < n; i++)
if (box1[i] >= box2[i]) return false;
return true;
} int dp(int i) // compute d[i]
{
if (d[i] > ) return d[i];
d[i] = ;
for (int j = ; j <= k; j++)
if (G[i][j])
d[i] = max(d[i], dp(j)+);
return d[i];
} void print_path(int i) // print the longest path starting with node i
{
printf("%d ", i);
for (int j = ; j <= k; j++)
if (G[i][j] && d[i] == d[j]+)
{
print_path(j);
break;
}
} int main()
{
#ifdef LOCAL
freopen("in", "r", stdin);
#endif
while (scanf("%d%d", &k, &n) != EOF)
{
for (int i = ; i <= k; i++)
for (int j = ; j < n; j++)
scanf("%d", &box[i][j]);
for (int i = ; i <= k; i++)
sort(box[i], box[i]+n);
memset(G, , sizeof(G));
for (int i = ; i <= k; i++)
for (int j = ; j <= k; j++)
if (is_nested(box[i], box[j]))
G[i][j] = ;
int ans = -;
int start = ;
memset(d, , sizeof(d));
for (int i = ; i <= k; i++)
{
int t = dp(i);
if (t > ans)
{
ans = t;
start = i;
}
}
printf("%d\n", ans);
print_path(start);
printf("\n");
}
return ;
}

最新文章

  1. Front End Developer Questions 前端开发人员问题(三)JavaScript部分
  2. BZOJ 1068: [SCOI2007]压缩
  3. Designing a Secure REST (Web) API without OAuth
  4. EasyUI datagrid 格式化显示数据
  5. 好玩的算法(JS版)
  6. linux whereis which
  7. Android 有用的快捷键
  8. CodeForces 150B- Quantity of Strings 推算..
  9. HDU1969:Pie(二分)
  10. webStorm和Sublime使用列编辑命令
  11. 使用SplitContainer来实现隐藏窗口的部分内容(转)
  12. Google的两种广告推广方式
  13. linux查看Java线程
  14. 洛谷P2765魔术球问题 最小路径覆盖
  15. Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields(理解)
  16. 如何利用 Jmeter 测试上传文件
  17. Quart.net配置oracle的坑
  18. 第85讲:Scala中For表达式的强大表现力实战
  19. Swift4 - 动态计算UITableView中tableHeaderView的高度 - 获取子控件高度和宽度
  20. oracle忘记sys及system密码

热门文章

  1. php 连接 mssql sql2008
  2. angularjs ng-switch
  3. wamp开机自动启动
  4. vr &amp; obv
  5. ext3文件系统目录限制问题
  6. bLock 回调 就是这么简单!
  7. Android客户端通过socket与服务器通信
  8. Jackson基础笔记
  9. Struts2--Result类型
  10. The 2014 ACM-ICPC Asia Regional Anshan Online