比赛 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];
    }