zoukankan      html  css  js  c++  java
  • 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;
    }
    
    
  • 相关阅读:
    Codeforces Round #384 (Div. 2)
    Codeforces Round #383 (Div. 2)
    bzoj-4514(网络流)
    bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)
    bzoj-1096 1096: [ZJOI2007]仓库建设(斜率优化dp)
    hdu-5988 Coding Contest(费用流)
    hdu-5992 Finding Hotels(kd-tree)
    用链表实现杭电1276士兵队列训练问题
    循环链表
    图书管理系统
  • 原文地址:https://www.cnblogs.com/zzy2005/p/10247917.html
Copyright © 2011-2022 走看看