• CF813D Two Melodies(dp)


    题面

    luogu
    Codeforces

    题目大意:

    • 给一个长度为(n)的序列,求两个不相交的子集长度之和最大是多少,能放入同一子集的条件是首先顺序不能变,然后每一个相邻的要么相差(1)或者相差(7)的倍数。

    • (n<=5000)

    题解

    (dp:)

    (f[i][j])表示第一序列到了第(i)位,第二个序列到了第(j)位,符合条件的长度之和最大

    显然, (f[i][j] == f[j][i])

    那么我们可以只考虑(i<j)

    暴力转移是(O(n^3))

    显然不行

    注意 相邻要么相差(1),要么相差(7)的倍数

    对于相差(1), 开一个桶记录(max)
    相差(7),就是 模(7) 同余

    也开一个桶

    这样复杂度就是(O(n^2))

    Code

    #include<bits/stdc++.h>
    
    #define LL long long
    #define RG register
    
    using namespace std;
    template<class T> inline void read(T &x) {
    	x = 0; RG char c = getchar(); bool f = 0;
    	while (c != '-' && (c < '0' || c > '9')) c = getchar(); if (c == '-') c = getchar(), f = 1;
    	while (c >= '0' && c <= '9') x = x*10+c-48, c = getchar();
    	x = f ? -x : x;
    	return ;
    }
    template<class T> inline void write(T x) {
    	if (!x) {putchar(48);return ;}
    	if (x < 0) x = -x, putchar('-');
    	int len = -1, z[20]; while (x > 0) z[++len] = x%10, x /= 10;
    	for (RG int i = len; i >= 0; i--) putchar(z[i]+48);return ;
    }
    const int N = 5010, M = 100010;
    int f[N][N], a[N];
    int pre[M], mod[10];
    int main() {
    	int n, ans = 0; read(n);
    	for (int i = 1; i <= n; i++) read(a[i]);
    	for (int i = 0; i <= n; i++) {
    		memset(mod, 0, sizeof(mod));
    		memset(pre, 0, sizeof(pre));
    		for (int j = 1; j < i; j++) {
    			pre[a[j]] = max(pre[a[j]], f[i][j]);
    			mod[a[j] % 7] = max(mod[a[j] % 7], f[i][j]);
    		}
    		for (int j = i+1; j <= n; j++) {
    			f[i][j] = max(pre[a[j] - 1], pre[a[j] + 1]) + 1;
    			f[i][j] = max(f[i][j], f[i][0] + 1);
    			f[i][j] = max(f[i][j], mod[a[j] % 7] + 1);
    			f[j][i] = f[i][j];
    			pre[a[j]] = max(pre[a[j]], f[i][j]);
    			mod[a[j] % 7] = max(mod[a[j] % 7], f[i][j]);
    			ans = max(ans, f[i][j]);
    		}
    	}
    	printf("%d
    ", ans);
    	return 0;
    }
    
    
  • 相关阅读:
    总结类初始化时的代码执行顺序
    Calcite数据源适配器对时间字段的操作问题
    如何自定义一个Calcite对Tablesaw查询的适配器
    Redis集群 Redis Cluster
    培养代码逻辑
    在线查看office文件的两种方法
    WPF Prism框架合集(9.Dialog)
    WPF Prism框架合集(8.Navigation)
    WPF Prism框架合集(7.Mvvm)
    springboot @OneToOne 解决JPA双向死循环/返回json数据死循环
  • 原文地址:https://www.cnblogs.com/zzy2005/p/10247917.html
Copyright © 2020-2023  润新知