分析
先看样例,发现k到达某个值的时候答案不变了,想想为什么。
因为可以任意选择放的位置,不妨先看看原数列有几个数字需要改变(相对)位置的,发现就是总数-最长上升子序列。所以k值到达需要改变的个数之后,就不会变化。
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int inf=(1<<30);
int t,n,a[510],ans[510];
int f[510][510];
int main()
{
cin>>t;
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++) f[i][j]=-inf;
}
for(int i=1;i<=n;i++)
{
f[i][1]=1;
ans[i]=inf;
}
f[1][0]=1,f[1][1]=-inf;
for(int i=1;i<=n;i++)
{
for(int j=0;j<i;j++)
{
if(f[i][j]==-inf) continue;
for(int k=i+1;k<=n;k++)
{
if(a[k]>a[i])
{
if(k==i+1) f[k][j]=max(f[k][j],f[i][j]+1);
else f[k][j+1]=max(f[k][j+1],f[i][j]+1);
}
}
}
}
int kk;
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
if(i==n) kk=0;
else kk=1;
for(int j=0;j<=k-kk;j++)
{
ans[k]=min(ans[k],n-f[i][j]);
}
}
}
for(int k=1;k<=n;k++) cout<<ans[k]<<' ';
cout<<endl;
}
return 0;
}