比赛 |
NOIP2023模拟赛1 |
评测结果 |
AAAAAAAAAA |
题目名称 |
奇怪的监狱 |
最终得分 |
100 |
用户昵称 |
宇战 |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2023-11-13 11:22:22 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int n,m,s,k,op,f[1010][1010],a[1010],b[1010];//f[i][j]表示放第i个到第j个最小花费(i<=j<=m)
int main(){
freopen("prison.in","r",stdin);
freopen("prison.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>a[i];
}
sort(a+1,a+1+m);
a[m+1]=n+1;//到边界
memset(f,0x3f,sizeof(f));
for(int i=1;i<=m;i++){
f[i][i]=a[i+1]-a[i-1]-2;//初始最小即它是最后一个放的
}//f[i][i]推到f[1][m]
for(int l=2;l<=m;l++){
for(int j=1;j+l-1<=m;j++){
for(int k=j;k<=l+j-1;k++){
int op=0;
op+=a[j+l]-a[j-1]-2;//第一个释放的总要花费的数额
if(k-1>=j){
op+=f[j][k-1];
}
if(l+j-1>=k+1){
op+=f[k+1][l+j-1];
}
f[j][j+l-1]=min(f[j][j+l-1],op);
}
}
}
cout<<f[1][m];
}