这个题写了几个小时...
思路是对的,但是代码中排序部分写的不对
思路应该是对每个箱子的维度进行排序,另外还要对所有的箱子排序(我就是错在这里)
不知道杭电1614是什么问题,感觉是抽了
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 32
using namespace std;
int n, k;
int dp[MAXN], s[MAXN];
struct Array {
int index;
int a[12];
}array[MAXN];
bool judge(int i, int j) {
for(int t=0; t<n; ++t) {
if(array[i].a[t] >= array[j].a[t])
return false;
}
return true;
}
bool cmp(Array c, Array d) {//这个排序方法一定要注意
for(int i=0; i<n; ++i) {
if(c.a[i] > d.a[i])
return false;
}
return true;
}
void dfs(int i) {
if(s[i] != i)
dfs(s[i]);
printf("%d ", array[i].index);
}
int main(void) {
while(~scanf("%d%d", &k, &n)) {
for(int i=0; i<k; ++i) {
for(int j=0; j<n; ++j) {
scanf("%d", &array[i].a[j]);
}
array[i].index = i+1;
sort(array[i].a, array[i].a+n);
dp[i] = 1;
s[i] = i;
}
sort(array, array+k, cmp);
s[0] = 0;
int ans = 1;
int pos = 0;
for(int i=1; i<k; ++i) {
for(int j=0; j<i; ++j) {
if(judge(j, i) && dp[i]<dp[j]+1) {
dp[i] = dp[j]+1;
s[i] = j;
}
}
//printf("dp[%d] = %d\n", i, dp[i]);
if(ans < dp[i]) {
ans = dp[i];
pos = i;
}
}
printf("%d\n", ans);
dfs(pos);
puts("");
}
return 0;
}