zoukankan      html  css  js  c++  java
  • Codeforces 583D. Once Again... (LIS变形)

    题目链接:http://codeforces.com/contest/583/problem/D

    给你t个长度为n的数组。问你最长不下降子序列的长度。

    一开始用第一个n数组的lis和最后一个n数组的lis和中间最多相同的数字出现的个数相加。这是错的,比如5 6 3 4 1 2 

    可以发现数组的长度很小,有一个循环节,最多是n吧。所以t <= n只要暴力求解。大于的话,再加上数字出现的最大次数*(t-n)

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int a[10005], cnt[305], dp[10005], inf = 1e8;
     4 int main()
     5 {
     6     int n, t;
     7     scanf("%d %d", &n, &t);
     8     int max_num = 0, len = n * min(n, t);
     9     for(int i = 1; i <= n; ++i) {
    10         scanf("%d", a + i);
    11         max_num = max(max_num, ++cnt[a[i]]);
    12     }
    13     for(int i = n + 1; i <= len; ++i) {
    14         a[i] = a[i - n];
    15     }
    16     int ans = 0;
    17     for(int i = 1; i <= len; ++i) {
    18         dp[i] = 1;
    19         for(int j = i - 1; j >= max(i - n, 1); --j) {  //不需要len*len , i - n之前的dp不是最优的
    20             if(a[i] >= a[j]) {
    21                 dp[i] = max(dp[i], dp[j] + 1);
    22             }
    23         }
    24         ans = max(ans, dp[i]);
    25     }
    26     if(t <= n) {
    27         printf("%d
    ", ans);
    28     } else {
    29         printf("%d
    ", ans + max_num*(t - n));
    30     }
    31     return 0;
    32 }
  • 相关阅读:
    吃货联盟订餐系统
    第一章课后习题
    hostapd阅读(openwrt)-1
    通过C语言获取MAC地址(转)
    OpenWrt 编译分割
    ubuntu 12.04无盘工作站
    WEB前端性能优化-如何提高页面加载速度
    HTML6
    easyui 根据值查找匹配
    收藏的网站
  • 原文地址:https://www.cnblogs.com/Recoder/p/5916829.html
Copyright © 2011-2022 走看看