C-Cities
#include<bits/stdc++.h>
using namespace std;
const int N=5050;
int f[N][N],a[N];
int n,m;
map<int,int> mp;
int pre[N];
int dfs(int l,int r)
{
if(l==r) return 0;
if(f[l][r]!=-1) return f[l][r];
int &v=f[l][r];
v=(r-l+1)-1;
if(a[l]==a[r])
v=min(v,dfs(l+1,r-1)+1);
else
v=min(v,dfs(l,r-1)+1);
for(int k=pre[r];k>l;k=pre[k])
v=min(v,dfs(l,k)+dfs(k+1,r));
return v;
}
int main()
{
ios::sync_with_stdio(false);cin.tie();cout.tie(0);
int Tc;
cin>>Tc;
while(Tc--)
{
mp.clear();n=0;
cin>>m;
for(int i=1;i<=m;i++)
{
int v;cin>>v;
if(v!=a[n])
{
a[++n]=v;
pre[n]=mp[v];
mp[v]=n;
}
}
memset(f,-1,sizeof f);
cout<<dfs(1,n)<<'\n';
}
return 0;
}
3996. 涂色
AcWing第 20 场周赛 是上面的题的弱化版
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
template <class T=int> T rd()
{
T res=0;T fg=1;
char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') fg=-1;ch=getchar();}
while( isdigit(ch)) res=(res<<1)+(res<<3)+(ch^48),ch=getchar();
return res*fg;
}
const int N=5005;
int n,m;
int f[N][N];
int a[N];
int dfs(int l,int r)
{
if(l==r) return 0;
if(f[l][r]!=-1) return f[l][r];
if(a[l]==a[r])
f[l][r]=dfs(l+1,r-1)+1;
else
f[l][r]=min(dfs(l+1,r),dfs(l,r-1))+1;
return f[l][r];
}
int main()
{
m=rd();
for(int i=1;i<=m;i++)
{
int s=rd();
if(s!=a[n]) a[++n]=s;
}
memset(f,-1,sizeof f);
printf("%d\n",dfs(1,n));
return 0;
}```