Codeforces Round #323 (Div. 1) B. Once Again... DP

链接:

http://codeforces.com/contest/582/problem/B

题意:

给你一个长度为n的序列,复制T次,求最长不下降子序列

题解:

n最大为100,所以我们可以计算出n*n的最长不下降子序列长度,如果T>n,

我们会发现中间一定会有重复的,重复的就是a数组中出现次数最多的数字

代码:

31 int n, T, a[110];
32 int dp[10010];
33 
34 int main() {
35     ios::sync_with_stdio(false), cin.tie(0);
36     cin >> n >> T;
37     map<int, int> cnt;
38     int Max = 0;
39     rep(i, 0, n) {
40         cin >> a[i];
41         cnt[a[i]]++;
42         Max = max(Max, cnt[a[i]]);
43     }
44     memset(dp, 0x3f, sizeof(dp));
45     if (T < 100) {
46         VI v;
47         rep(i, 0, T) rep(j, 0, n) v.pb(a[j]);
48         n *= T;
49         rep(i, 0, n) *upper_bound(dp, dp + n, v[i]) = v[i];
50         cout << lower_bound(dp, dp + n, INF) - dp << endl;
51     }
52     else {
53         VI v;
54         rep(i, 0, 100) rep(j, 0, n) v.pb(a[j]);55         n *= 100;
56         rep(i, 0, n) *upper_bound(dp, dp + n, v[i]) = v[i];
57         cout << (lower_bound(dp, dp + n, INF) - dp) + Max*(T - 100) << endl;
58     }
59     return 0;
60 }

 

posted @ 2017-08-08 11:04  Flowersea  阅读(139)  评论(0编辑  收藏  举报