• [不知道哪来的题] Subsequence


    Description

    给出两个由小于等于 (k) 的正整数构成的数列 (A)(B) ,长度为 (n)(m)

    现在需要一个由小于等于 (k) 的正整数构成的数列 (C) ,使得 (C) 既不是 (A) 的子序列,也不是 (B)
    的子序列。

    请求出 (C) 的最小长度。

    (n,m,kle 4000)

    Solution

    (dp[i][j]) 表示 (A) 扫到 (i)(B) 扫到 (j)(C) 的最小长度。

    预处理一下下一个与当前位置值相同的位置就好了。

    #include<bits/stdc++.h>
    using namespace std;
    
    template <class T> inline void read(T &x) {
    	x = 0; static char ch = getchar(); for (; ch < '0' || ch > '9'; ch = getchar());
    	for (; ch >= '0' && ch <= '9'; ch = getchar()) (x *= 10) += ch - '0';
    }
    
    #define N 4010
    #define rep(i, a, b) for (int i = a; i <= b; i++)
    #define drp(i, a, b) for (int i = a; i >= b; i--)
    
    int n, m, K, a[N], b[N], dp[N][N], f1[N][N], f2[N][N], ans;
    
    inline void upd(int& x, int y) { if (!x || x > y) x = y; }
    
    int main() {
    	read(n), read(m), read(K);
    	rep(i, 1, n) read(a[i]);
    	rep(i, 1, m) read(b[i]);
    	drp(i, n, 1) {
    		rep(j, 1, K) f1[i][j] = f1[i + 1][j];
    		f1[i][a[i]] = i;
    	}
    	drp(i, m, 1) {
    		rep(j, 1, K) f2[i][j] = f2[i + 1][j];
    		f2[i][b[i]] = i;
    	}
    	dp[0][0] = 1, ans = min(n, m) + 1;
    	rep(i, 0, n) rep(j, 0, m) if (a[i] == b[j] && dp[i][j]) rep(k, 1, K)
    		if (!f1[i + 1][k] && !f2[j + 1][k]) ans = min(ans, dp[i][j]);
    		else upd(dp[f1[i + 1][k]][f2[j + 1][k]], dp[i][j] + 1);
    	printf("%d", ans);
    	return 0;
    }
    
  • 相关阅读:
    java 单例设计模式
    JAVAWEB监听器(二)
    pxe无人值守安装linux机器笔记----摘抄
    Ganglia3.1.7安装与配置(收录)
    Hadoop Sentry 学习
    安装和配置Sentry(收录)
    sqoop 的使用 -20160410
    深度分析如何在Hadoop中控制Map的数量(摘抄)
    CDH,CM下载
    大数据培训班 cloudera公司讲师面对面授课 CCDH CCAH CCP
  • 原文地址:https://www.cnblogs.com/aziint/p/9164189.html
Copyright © 2020-2023  润新知