思路是:先对长乘以重量进行排序,除去完全相同的(l,w分别相等),然后依次计算dp(i),最后统计f[i] == 1的个数。
为什么这样考虑呢?看图:
为什么这样不对呢?看图:
这就说明了统计1的个数的想法是错误的。
看了网上的代码,都说是贪心。
谁说WA的代码就没用?
1 # include <stdio.h>
2 # include <memory.h>
3 # include <stdlib.h>
4
5 typedef struct {
6 int l, w;
7 }stick;
8
9 int T, n;
10 int mask[5002];
11 int f[5002];
12 stick s[5002];
13
14 int dp(int i);
15
16 int scmp(const void *xx, const void *yy)
17 {
18 return (*(stick*)xx).l*(*(stick*)xx).w < (*(stick*)yy).l*(*(stick*)yy).w ? -1:1;
19 }
20
21 int main()
22 {
23 int i, ans;
24
25 scanf("%d", &T);
26 while (T--)
27 {
28 scanf("%d", &n);
29 for ( i = 1; i <= n; ++i)
30 scanf("%d%d", &s[i].l, &s[i].w);
31
32 qsort(s+1, n, sizeof(stick), scmp);
33
34 memset(mask, 0, sizeof(mask));
35 for ( i = 1; i < n; ++i)
36 while (i < n && s[i+1].l == s[i].l && s[i+1].w == s[i].w)
37 {
38 mask[i] = 1;
39 ++i;
40 }
41
42 ans = 0;
43 memset(f, 0, sizeof(f));
44 for ( i = 1; i <= n; ++i)
45 {
46 if (!mask[i] && !f[i]) dp(i);
47 if (f[i] == 1) ++ans;
48 }
49
50 printf("%d\n", ans);
51 }
52
53 return 0;
54 }
55
56 int dp(int i)
57 {
58 int k, tmp, ti;
59 if (f[i]) return f[i];
60
61 f[i] = 1;
62 for ( k = i+1; k <= n; ++k)
63 if (!mask[k] && s[i].l<=s[k].l && s[i].w<=s[k].w && f[i]<(tmp = dp(k)+1))
64 f[i] = tmp;
65
66 return f[i];
67 }