博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 103 Stacking Boxes
阅读量:6045 次
发布时间:2019-06-20

本文共 3114 字,大约阅读时间需要 10 分钟。

UVA_103

    首先我们应该对坐标内部排序,之后一个直观的想法就是扫描一遍所有盒子,如果i可以放到j内,就连一条i->j的有向边,然后求dfs树形图的最深层数即可。

    另外,我们也可以对盒子按第一个坐标进行排序,然后去求最长上升子序列。

#include
#include
#include
int N, K, G[40][40], a[40][20], indgr[40], outdgr[40], path[40], max; int cmp(const void *_p, const void *_q) {
int *p = (int *)_p; int *q = (int *)_q; return *p - *q; } int suit(int i, int j) {
int k; for(k = 0; k < K; k ++) if(a[i][k] >= a[j][k]) return 0; return 1; } int dfs(int cur, int num) {
int i, j, ok; if(outdgr[cur] == 0) {
if(num > max) {
max = num; path[num] = cur; return 1; } return 0; } ok = 0; for(i = 0; i < N; i ++) if(G[cur][i] && dfs(i, num + 1)) {
path[num] = cur; ok = 1; } return ok; } void init() {
int i, j; for(i = 0; i < N; i ++) {
for(j = 0; j < K; j ++) scanf("%d", &a[i][j]); qsort(a[i], K, sizeof(a[i][0]), cmp); } memset(G, 0, sizeof(G)); memset(indgr, 0, sizeof(indgr)); memset(outdgr, 0, sizeof(outdgr)); for(i = 0; i < N; i ++) for(j = 0; j < N; j ++) if(suit(i, j)) {
G[i][j] = 1; outdgr[i] ++; indgr[j] ++; } } void solve() {
int i; max = 0; for(i = 0; i < N; i ++) if(!indgr[i]) dfs(i, 1); printf("%d\n", max); for(i = 1; i <= max; i ++) {
if(i > 1) printf(""); printf("%d", path[i] + 1); } printf("\n"); } int main() {
while(scanf("%d%d", &N, &K) == 2) {
init(); solve(); } return 0; }

 

#include
#include
#include
int N, K, r[40], f[40], a[40][20], fa[40]; int cmp1(const void *_p, const void *_q) {
int *p = (int *)_p; int *q = (int *)_q; return *p - *q; } int cmp2(const void *_p, const void *_q) {
int *p = (int *)_p; int *q = (int *)_q; return a[*p][0] - a[*q][0]; } int suit(int i, int j) {
int k; for(k = 0; k < K; k ++) if(a[i][k] >= a[j][k]) return 0; return 1; } void init() {
int i, j; for(i = 0; i < N; i ++) {
for(j = 0; j < K; j ++) scanf("%d", &a[i][j]); qsort(a[i], K, sizeof(a[i][0]), cmp1); } for(i = 0; i < N; i ++) r[i] = i; qsort(r, N, sizeof(r[0]), cmp2); } void printresult(int cur) {
if(fa[cur] == -1) printf("%d", r[cur] + 1); else {
printresult(fa[cur]); printf(" %d", r[cur] + 1); } } void solve() {
int i, j, max, p; for(i = 0; i < N; i ++) f[i] = 1; memset(fa, -1, sizeof(fa)); for(i = 0; i < N; i ++) for(j = 0; j < i; j ++) {
if(suit(r[j], r[i]) && f[j] + 1 > f[i]) {
f[i] = f[j] + 1; fa[i] = j; } } max = 0; for(i = 0; i < N; i ++) if(f[i] > max) {
max = f[i]; p = i; } printf("%d\n", max); printresult(p); printf("\n"); } int main() {
while(scanf("%d%d", &N, &K) == 2) {
init(); solve(); } return 0; }

转载地址:http://oejex.baihongyu.com/

你可能感兴趣的文章
CSS3 transforms 3D翻开
查看>>
利用传入的Type类型来调用范型方法的解决方案
查看>>
Top命令内存占用剖析
查看>>
转 网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO
查看>>
求带分数(蓝桥杯)
查看>>
Retrofit 入门学习
查看>>
Spring Boot学习笔记
查看>>
laravel 集合接口
查看>>
java.exe进程来源排查录
查看>>
C++实现KMP模式匹配算法
查看>>
JSONObject与JSONArray的使用
查看>>
除了《一无所有》,我一无所有
查看>>
每日英语:China Seeks to Calm Anxiety Over Rice
查看>>
C++中struct和class的区别 [转]
查看>>
C++ ofstream和ifstream详细用法
查看>>
Mysql 连接查询 Mysql支持的连接查询有哪些
查看>>
Hive Streaming 追加 ORC 文件
查看>>
打开Apache自带的Web监视器
查看>>
eclipse插件
查看>>
Android笔记:通过RadioGroup/RadioButton自定义tabhost的简单方法
查看>>