首页 > 其他分享 >45th ICPC昆明 C.Cities(区间dp)

45th ICPC昆明 C.Cities(区间dp)

时间:2022-11-07 21:45:03浏览次数:79  
标签:45th 颜色 int pos len ICPC -- Cities dp

题目链接

Description

有n个点,每个点有自己的颜色(并且每种颜色出现次数不超过15次),每次操作可以把一段连续且颜色相同的点染成任意一种颜色,求把所有点染成相同颜色的最小操作次数。
\(1\leq n \leq 5000\)

Solution

首先我们可以贪心,把连续的一段缩成一个点。

区间\(dp\),\(dp[l][r]\)表示把\([l,r]\)这一段染成相同颜色的最小操作次数。
朴素的区间\(dp\)转移是\(n^3\)的。
但是这里有一个条件,每种颜色出现次数不超过15次,我们改变状态的定义,\(dp[l][r]\)表示把\([l,r]\)这一段染成与\(l\)点相同的颜色的最小操作次数,
预处理缩点之后的每个点的下一个相同颜色的点在哪个位置,利用这些点进行状态的转移。
假如与\(l\)点颜色相同的且在\([l,r]\)这一段的一些点是\(mid\),那么\(dp[l][r] = min(dp[l][r], dp[l][mid - 1] + dp[mid][r])\)。

#include <bits/stdc++.h>
#define endl '\n'

using namespace std;
using ll = long long;

void solve() {
    int n; cin >> n;
    vector<int> a(n + 1, -1), nxt(n + 1), pos(n + 1, n + 1);
    vector<vector<int>> dp(n + 2, vector<int> (n + 2, 1 << 29));
    for (int i = 1;i <= n;i++) {
        cin >> a[i];
        if (a[i] == a[i - 1] && i > 1) {
            i --, n --;
        }
    }
     for (int i = n;i > 0;i--) {
         nxt[i] = pos[a[i]];
         pos[a[i]] = i;
         dp[i][i] = 0;
    }
    for (int len = 1;len < n;len ++) {
        for (int l = 1;l + len <= n;l ++) {
            int r = l + len;
            dp[l][r] = min(dp[l + 1][r], dp[l][r - 1]) + 1;
            int mid = nxt[l];
            while (mid <= r) {
                dp[l][r] = min(dp[l][r], dp[l][mid - 1] + dp[mid][r]);
                mid = nxt[mid];
            }
        }
    }
    cout << dp[1][n] << endl;
}
signed main(void) {
	cin.tie(nullptr), cout.tie(nullptr) -> ios::sync_with_stdio(false);
    int t; cin >> t;
    while (t --)
	solve(); 
	return 0;
} 

另一种做法:
如果一段区间两个端点的颜色相同,那么我们对这一段区间染色时,相比于两个端点的颜色不同可以少一次染色操作,那么贪心的想,需要最大化区间两个端点颜色相同时的染色次数。

转移不是很彻底的懂,这种做法当作开拓思路了。

#include <bits/stdc++.h>
#define endl '\n'

using namespace std;
using ll = long long;

void solve() {
    int n; cin >> n;
    vector<int> a(n + 1, -1), nxt(n + 1), pos(n + 1, n + 1);
    vector<vector<int>> dp(n + 1, vector<int> (n + 1, 0));
    for (int i = 1;i <= n;i++) {
        cin >> a[i];
        if (a[i] == a[i - 1] && i > 1) {
            i --, n --;
        }
    }
     for (int i = n;i > 0;i--) {
         nxt[i] = pos[a[i]];
         pos[a[i]] = i;
    }
    for (int len = 1;len < n;len ++) {
        for (int l = 1;l + len <= n;l ++) {
            int r = l + len;
            dp[l][r] = max(dp[l + 1][r], dp[l][r - 1]);
            int mid = nxt[l];
            while (mid <= r) {
                dp[l][r] = max(dp[l][r], dp[l + 1][mid - 1] + dp[mid][r] + 1);
                mid = nxt[mid];
            }
        }
    }
    cout << n - 1 - dp[1][n] << endl;
}
signed main(void) {
	cin.tie(nullptr), cout.tie(nullptr) -> ios::sync_with_stdio(false);
    int t; cin >> t;
    while (t --)
	solve(); 
	return 0;
} 

标签:45th,颜色,int,pos,len,ICPC,--,Cities,dp
From: https://www.cnblogs.com/coldarra/p/16867583.html

相关文章

  • 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(济南)
    比赛链接:https://ac.nowcoder.com/acm/contest/10662/C.StoneGame题意:有\(a1\)堆有1个石子的石堆,\(a2\)堆有两个石子的石堆,\(a3\)堆有三个石子的石堆。合并两......
  • ICPC2022沈阳站游记
    拿到了本校第一个区域赛银。本来目标只是拿铜的,因为这场队伍实在太多了,但没想到质量不是很高。赛前就决定要拼速度。开赛前看封面,DRXVST1,却没想到这是签到题。还好......
  • ICPC沈阳 D A Bite of Teyvat
    ·#include<bits/stdc++.h>#defineM100005#definePI3.14159265358979323846#defineDlongdouble#defineeps1e-11usingnamespacestd;DXX=0,YY=0;Dsq......
  • 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(济南)-L Bit Sequence
    题意给你两个数l,m,大小为m的数组a,求[0,l]之间满足以下条件的数x的个数:对于任何i输入[0,m-1],f(x+i)%2=a[i];f(k):代表k在二进制下1的个数m的范围<=100,l<=1e18,a[i]=0/1......
  • 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京)
    LLet'sPlayCurling分析:转换一下就是找每两个b之间最多有多少个a先离散化再树状数组维护一下就好#include<bits/stdc++.h>usingnamespacestd;#definelowbit......
  • The 2021 ICPC Asia Shanghai & Shenyang Regional Contest
    赛前练习。上海站沈阳站[L]分析:容斥+树形DP。但是一开始想DP是\(O(n^3)\)的,于是想用NTT优化成\(O(n^2logn)\),但是还是T了。后来看题解,发现没有注意到转移时只......
  • 2021 ICPC 沈阳站
    CodeforcesBBitwiseExclusive-ORSequenceDescription给定\(n\)个数和\(m\)个限制:\(a_u\a_v\w\),要求\(a_u\bigoplusa_v=w\)求这\(n\)个数的和的最小值。S......
  • 2021ICPC济南
    2021ICPC济南时隔一年再来补题,金牌题以下还是可以补的。C(组合数学,DP,贪心)题意两人每次从序列中取数字,希望自己拿到的数字和最大。求可行的操作序列方案数。思路看起来......
  • 1013 Battle Over Cities
    Itisvitallyimportanttohaveallthecitiesconnectedbyhighwaysinawar.Ifacityisoccupiedbytheenemy,allthehighwaysfrom/towardthatcityarec......
  • The 2021 ICPC Asia Shenyang Regional Contest
    The2021ICPCAsiaShenyangRegionalContest我们按难易程度来,E,F<B,J<H,I,L,ME.EdwardGaming,theChampion直接输出edgnb子字符串数量。F.EncodedStringsI分......