题解,求关注
2024-07-01 10:01:51
发布于:浙江
11阅读
0回复
0点赞
#include <bits/stdc++.h>
using namespace std;
const int N=10010,M=110,Inf=1e9;
int n,m,cnt,a[N],f[N][M],g[2][N][M];
int main()
{
scanf("%d%d",&n,&m);
memset(f,0x3f3f3f3f,sizeof(f));
f[0][1]=0;
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
g[0][i][j]=g[0][i-1][j]+(a[i]>=j)*(a[i]!=-1);
for (int i=n;i>=1;i--)
for (int j=1;j<=m;j++)
g[1][i][j]=g[1][i+1][j]+(a[i]<=j)*(a[i]!=-1);
for (int i=1;i<=n;i++)
{
if (a[i]!=-1)
{
memcpy(f[i],f[i-1],sizeof(f[i]));
cnt+=g[0][i-1][a[i]+1];
}
else
{
int minn=Inf;
for (int j=1;j<=m;j++)
{
minn=min(minn,f[i-1][j]);
f[i][j]=minn+g[0][i-1][j+1]+g[1][i+1][j-1];
}
}
}
int ans=Inf;
for (int i=1;i<=m;i++)
ans=min(ans,f[n][i]);
printf("%d",ans+cnt);
return 0;
}
这里空空如也
有帮助,赞一个