TYVJ 1072 bomb 解题报告
2011-07-15 15:10
246 查看
这题第一问就是最长上升序列,不解释。
第二问说一下,首先,如果i可以打到j,那就把i,j之间加一条边,然后搜最大匹配。最大匹配出来的结果是边数的结果,然后用节点数减去变数就是有多少条链(画图看),感觉好像生物里的氨基酸——多肽。
代码:
第二问说一下,首先,如果i可以打到j,那就把i,j之间加一条边,然后搜最大匹配。最大匹配出来的结果是边数的结果,然后用节点数减去变数就是有多少条链(画图看),感觉好像生物里的氨基酸——多肽。
代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> #define max(a, b) ((a)>(b)?(a):(b)) struct num{ int x, y, z; }num[1000]; int f[1000]; int ans, n; int map[1000][1000]; int used[1000]; int from[1000]; int find(int k) { int i; for(i = 0; i < n; i++){ if(map[k][i] && !used[i]){ used[i] = 1; if(from[i] == -1 || find(from[i])){ from[i] = k; return 1; } } } return 0; } int com(const void *a, const void *b) { struct num *i = (struct num *)a, *j = (struct num *)b; return i->x - j->x; } int main(int argc, char **argv) { int i, j; scanf("%d", &n); for(i = 0; i < n; i++){ scanf("%d%d%d", &num[i].x, &num[i].y, &num[i].z); } qsort(num, n, sizeof(struct num), com); for(i = 0; i < n; i++){ f[i] = 1; for(j = 0; j < i; j++){ if(num[i].x > num[j].x && num[i].y > num[j].y && num[i].z > num[j].z){ f[i] = max(f[i], f[j] + 1); } } ans = max(ans, f[i]); } printf("%d\n", ans); for(i = 0; i < n; i++){ for(j = 0; j < n; j++){ if(num[i].x < num[j].x && num[i].y < num[j].y && num[i].z < num[j].z){ map[j][i] = 1; } } } for(i = 0; i < n; i++){ from[i] = -1; } for(i = ans = 0; i < n; i++){ memset(used, 0, sizeof(used)); if(find(i)){ ans++; } } printf("%d\n", n - ans); return 0; }
相关文章推荐
- TYVJ 1075 硬币游戏 解题报告
- TYVJ 1091 等差数列 解题报告
- TYVJ 1124 花店橱窗 解题报告
- TYVJ 1073 加分二叉树 解题报告
- TYVJ 1103 多项式输出 解题报告
- TYVJ1993 ACM/ICPC 2001 括号序列 解题报告
- TYVJ 1074 武士风度的牛 解题报告
- TYVJ 1115 同余 解题报告
- TYVJ 1125 JR's chop 解题报告
- [TYVJ1730]二逼平衡树解题报告
- hdu 1072 解题报告 ---- Nightmare
- TYVJ 1057 金明的预算方案 解题报告
- TYVJ 1061 Mobile Service 解题报告
- TYVJ 1076 数字三角形2 解题报告
- TYVJ 1107 Hankson的趣味题 解题报告
- TYVJ 1117 拯救ice-cream 解题报告
- HOJ 3555 Bomb 解题报告
- TYVJ 1065 津津的储蓄计划 解题报告
- TYVJ 1069 cowtour 解题报告
- TYVJ 1085 派对 解题报告