NYOJ 16 DP

链接:

http://acm.nyist.net/JudgeOnline/problem.php?pid=16

题意:

中文题就不说题意了

题解:

两种解法,第一种是如果宽>长的话就交换一下 然后排序 LIS

第二种解法是不用交换,直接建图,dfs,

代码:

31 int n;
32 VI G[MAXN];
33 PII p[MAXN];
34 int dp[MAXN];
35 
36 int dfs(int u) {
37     if (dp[u]) return dp[u];
38     dp[u] = 0;
39     rep(i, 0, G[u].size())
40         dp[u] = max(dp[u], dfs(G[u][i]));
41     dp[u]++;
42     return dp[u];
43 }
44 
45 int main() {
46     ios::sync_with_stdio(false), cin.tie(0);
47     int T;
48     cin >> T;
49     while (T--) {
50         rep(i, 0, MAXN) G[i].clear();
51         memset(dp, 0, sizeof(dp));
52         cin >> n;
53         rep(i, 0, n) cin >> p[i].first >> p[i].second;
54         rep(i, 0, n) rep(j, 0, n)
55             if (p[i].first > p[j].first && p[i].second > p[j].second ||
56                 p[i].first > p[j].second && p[i].second > p[j].first)
57                 G[i].pb(j);
58         int ans = 0;
59         rep(i, 0, n) if (!dp[i]) ans = max(ans, dfs(i));
60         cout << ans << endl;
61     }
62     return 0;
63 }

 

posted @ 2017-05-24 22:18  Flowersea  阅读(145)  评论(0)    收藏  举报