E - Sorting Books
题意
n n n 本书的颜色分别是 a 1 , a 2 , … , a n a_1,a_2,…,a_n a1,a2,…,an ,每次可以把一本书移到最右边,问最少移动几次可以使颜色相同的书全部相邻?
思路
参考:Codeforces Round #699 (Div. 2) E.Sorting Books(贪心+DP / 线段树)超高质量题解,看不懂来打我 ~_ 真的讲的8错
赛场上贪错了,只考虑了把书都移到后面来合并的情况,没有考虑把夹杂在中间的书移到后面的情况。对于我这样的dp蒟蒻这题很需要单独列出来放到dp专栏里(虽然还是蛮简单的,但是奈何我想不出啊)。
代码
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define PI acos(-1)
using namespace std;
typedef pair<int, int> P;
typedef long long ll;
const int N = 5e5 + 19;
const ll mod = 1e9 + 7;
int a[N];
int cur_cnt[N];
int cnt[N];
int dp[N];
int L[N];
int R[N];
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> a[i];
if(L[a[i]] == 0)
L[a[i]] = i;
R[a[i]] = i;
cnt[a[i]]++;
}
for(int i = n; i > 0; i--)
{
cur_cnt[a[i]]++;
if(L[a[i]] == i)
{
dp[i] = max(dp[i + 1], cnt[a[i]] + dp[R[a[i]] + 1]);
}
else
{
dp[i] = max(dp[i + 1], cur_cnt[a[i]]);
}
}
cout << n - dp[1] << endl;
return 0;
}