zoukankan      html  css  js  c++  java
  • 释放囚犯

    题目描述

    Caima王国中有一个奇怪的监狱,这个监狱一共有P个牢房,这些牢房一字排开,第i个紧挨着第i+1个(最后一个除外)。现在正好牢房是满的。

    上级下发了一个释放名单,要求每天释放名单上的一个人。这可把看守们吓得不轻,因为看守们知道,现在牢房中的P个人,可以相互之间传话。如果某个人离开了,那么原来和这个人能说上话的人,都会很气愤,导致他们那天会一直大吼大叫,搞得看守很头疼。如果给这些要发火的人吃上肉,他们就会安静点。

    输入输出格式

    输入格式:

    第一行两个数P和Q,Q表示释放名单上的人数;

    第二行Q个数,表示要释放哪些人。

    【数据规模】

    对于100%的数据1≤P≤1000; 1≤Q≤100;Q≤P;且50%的数据 1≤P≤100;1≤Q≤5

    输出格式:

    仅一行,表示最少要给多少人次送肉吃。

    输入输出样例

    输入样例#1: 
    20 3
    3 6 14
    输出样例#1: 
    35
    

    说明

    【样例说明】

    先释放14号监狱中的罪犯,要给1到13号监狱和15到20号监狱中的19人送肉吃;再释放6号监狱中的罪犯,要给1到5号监狱和7到13号监狱中的12人送肉吃;最后释放3号监狱中的罪犯,要给1到2号监狱和4到5号监狱中的4人送肉吃。

    分析:

    本题可以设F[i][j]表示释放i——>j所需要的最少数量,然后枚举断点k,这样一来就变成了区间DP模板题目了。

    CODE:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 using namespace std;
     6 const int inf=1<<20;
     7 int n,m;
     8 int a[1005];
     9 int f[105][105];  
    10 int main() {  
    11     cin>>n>>m; 
    12     for(int i=1;i<=m;i++) cin>>a[i];
    13     a[0]=0;
    14     a[m+1]=n+1;  
    15     sort(a,a+m+1);    
    16     for(int l=1;l<=m;l++){ 
    17         for(int i=1;i+l-1<=m;i++){  
    18             int j=i+l-1;  
    19             f[i][j]=1<<20; 
    20             for (int k=i;k<=j;k++){
    21                  f[i][j]=min(f[i][j],f[i][k-1]+f[k+1][j]+a[j+1]-a[i-1]-1-1);
    22             } 
    23         }  
    24     }
    25     cout<<f[1][m]<<endl;
    26     //system("pause");
    27     return 0;  
    28 }  
  • 相关阅读:
    [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树
    [BZOJ3230] 相似字串 后缀数组+RMQ
    [BZOJ4556][Tjoi2016&Heoi2016]字符串 后缀数组+主席树
    [BZOJ4044]Virus synthesis 回文自动机的DP
    [BZOJ2055]80人环游世界 有上下界最小费用最大流
    [BZOJ2502]清理雪道 有上下界网络流(最小流)
    [BZOJ2095][Poi2010]Bridges 最大流(混合图欧拉回路)
    [BZOJ2288&BZOJ1150]一类堆+链表+贪心问题
    [BZOJ4820]硬币游戏 KMP+高斯消元
    [BZOJ1559]密码 AC自动机+状压
  • 原文地址:https://www.cnblogs.com/kanchuang/p/11185713.html
Copyright © 2011-2022 走看看