• 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 }
  • 相关阅读:
    设计工具
    makefile介绍1.0
    cpp命名空间
    第二课 生活智慧
    第一课 我想找到好工作,我想挣钱
    php CURL
    apache 改变文档根目录www的位置
    yii2 模块的创建及使用
    yii2 源码分析Action类分析 (六)
    yii2 源码分析 model类分析 (五)
  • 原文地址:https://www.cnblogs.com/xingkongyihao/p/8870159.html
Copyright © 2020-2023  润新知