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 }

浙公网安备 33010602011771号