zoukankan      html  css  js  c++  java
  • L K序列

    题目描述

    给一个数组 a,长度为 n,若某个子序列中的和为 K 的倍数,那么这个序列被称为“K 序列”。现在要你 对数组 a 求出最长的子序列的长度,满足这个序列是 K 序列。 

    输入描述:

    第一行为两个整数 n, K, 以空格分隔,第二行为 n 个整数,表示 a[1] ∼ a[n],1 ≤ n ≤ 105 , 1 ≤ a[i] ≤ 109 , 1 ≤ nK ≤ 107

    输出描述:

    输出一个整数表示最长子序列的长度 m
    示例1

    输入

    7 5
    10 3 4 2 2 9 8

    输出

    6

    动态规划解,复杂度nk

    先初始化dp[last][j] 表示加到1时需要的最大数量,先初始化dp[0][a[i]] = 1,而其它是0,然后后面在前面的基础上加1或者不加。最大dp[last][0]就是结果了。

     1 //dp做法
     2 #include <iostream>
     3 #include <string.h>
     4 using namespace std;
     5 const int N = 1e5+10;
     6 int a[N];
     7 int main() {
     8     int n, k;
     9     cin >> n >> k;
    10     int dp[2][k+10];
    11     memset(dp, 0, sizeof(dp));
    12     for(int i = 1; i <= n; i ++) {
    13         cin >> a[i];
    14         a[i] %= k;
    15     }
    16     dp[0][a[1]] = 1;
    17     int last = 0;
    18     for(int i = 2; i <= n; i ++) {
    19         last = 1 - last;
    20         for(int j = 0; j < k; j ++) {
    21             if(dp[1-last][j]) 
    22                 dp[last][(j+a[i])%k] = max(dp[1-last][(j+a[i])%k],dp[1-last][j]+1);
    23             else dp[last][(j+a[i])%k] = dp[1-last][(j+a[i])%k];
    24         }
    25     }
    26     cout << dp[last][0] << endl;
    27     return 0;
    28 }
  • 相关阅读:
    VSFTP日志文件详解
    RocketMQ多master多salve集群搭建
    数据持久化之bind Mounting
    数据持久化之Data Volume
    gitLab 分支保护设置
    docker容器的端口映射
    docker命令之link
    NFS客户端挂载失败之authenticated unmount request from
    docke网络之bridge、host、none
    docke通信之Linux 网络命名空间
  • 原文地址:https://www.cnblogs.com/xingkongyihao/p/8870159.html
Copyright © 2011-2022 走看看