B监狱 noip 模拟 7.29(区间DP)

监狱
题目描述

有一座监狱,有N个牢房,N个牢房呈一字排成一排的。也就是说,第i个牢房紧挨着第i+1个(除了末尾那个)。每个牢房里都关押着一名罪犯,总共N名罪犯。
    上级要求将某些罪犯释放,给了一份名单,要求每天释放一个人。
    位于相邻牢房的罪犯,他们互相之间可以谈话也可以传话,这就使得这里的N名罪犯都可以相互聊天。如果有一个人离开了,那么能和说他上话的人就会很狂躁。如果想让他们安静下来,看守必须给狂躁的人吃一顿火锅。但看守们希望送火锅的次数越少越好。请你计算需要送火锅的次数。
123

输入格式

第一行两个数N和M,M表示要释放名单上的人数;
第二行M个数,表示释放哪些人
12

输出格式

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

样例输入

20 3
3 6 14
12

样例输出

35

这道题我真的是想了很久QAQ

开先打了个70 分算法

一直纠结 O(m^3) 算法

网上找了好久 题解也看了 很多 终于悟出了一些小细节

方法一:

定义 f[i][j] 表示 i 到 j 号 囚犯已经被释放

注意 是被释放的囚犯

所以 对于 每一个小区间的状态都是 于原区间一样

那么i号释放的代价 为 他左右两边 的没有释放资格的囚犯数

所以枚举断点 k

K 将 i 到 j 分成 区间 [i,k-1] [k+1,j]  对于每个区间 都已经被算好了 k 就是第一个来更新 [i,j]的 才会 把 [i,j] 分成两个独立的区间

所以代价为 a[j+1]-a[i-1]-2 (这里想了很久,其实想想也是  对于区间 [i,j] 是释放囚犯的集合 他其实包含了没有释放资格的囚犯 a[j+1]-a[i-1]-2 是 i-

1号释放囚犯 和 j+1 号释放囚犯间的 人数)

-2? 因为 自己不更新

所以我们有状态转移方程

f[i][j]=min(f[i][j],f[i][k-1]+f[k+1][j]+a[j+1]-a[i-1]-2);

时间复杂度 O(M^3)

某ruan姓同学思路:

枚举k∈[i,j],k是区间[i,j]内第一个被放出去的囚犯,这个区间内本来有a[j+1]-a[i-1]-1个囚犯,放出去一个之后剩下a[j+1]-a[i-1]-2个囚犯都要吃火锅

然后区间[i,j]被分成了[i,k-1]和[k+1,j]

因为第k个囚犯被放出去了

code:

//
#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
#define maxnn 4002
int f[maxnn][maxnn];
int n,m;
int a[101];
int s[maxnn][maxnn];
int sum[maxnn];
int res[maxnn];
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>a[i];
    }
    sort(a+1,a+1+m);
    a[m+1]=n+1;
    for(int i=m;i>=1;i--)
    for(int j=i;j<=m;j++)
    {    f[i][j]=1e9;
        for(int k=i;k<=j;k++)
        f[i][j]=min(f[i][k-1]+f[k+1][j]+a[j+1]-a[i-1]-2,f[i][j]);

    }cout<<f[1][m];
}

至于为甚么 a[m+1]=n+1;因为 n节点不是一个有释放资格的囚犯

方法2:

f[i][j]表示将第i个区间到第j个区间的人全部合并的最小代价

那么对于f[i][j],我们就可以枚举中间区间mid
那么f[i][j]的求值表达是就是

f[i][j]=min(f[i][j],f[i][mid]+f[mid+1]][j]+sum[j]-sum[i-1]-2){其中i<=mid<j}

解释一下
f[i][mid]+f[mid+1][j]表示的是之前进去的人请吃的火锅
sum[j]-sum[i-1]-1表示的是这一整段区间的人数之和
因为请吃火锅的这个人本身不吃,所以还要-1

得到==>f[i][mid]+f[mid+1][j]+sum[j]-sum[i-1]-2

合并区间!!  式子+代价

https://blog.csdn.net/qq_37920580/article/details/77936432

原文地址:https://www.cnblogs.com/OIEREDSION/p/11279740.html

时间: 2024-10-09 08:08:30

B监狱 noip 模拟 7.29(区间DP)的相关文章

noip模拟 分割土地(dp)

#include<cstdio> #include<cstring> using namespace std; const int mod=1e8+7; const int N=1010; int f[N][N<<1][2]; int main() { freopen("field.in","r",stdin); freopen("field.out","w",stdout); int n,

【NOIP 模拟赛】区间第K大(kth) 乱搞

biubiu~~~ 这道题就是预处理,我们就是枚举每一个数,找到左边比他大的数的个数以及其对应的区间,右边也如此,我们把左边的和右边的相乘就得到了我们的答案,我们发现这是O(n^3)的,但是实际证明他能A,分析证明他的时间复杂度是较小的,这个故事告诉我们,对于一些估计的时间复杂度,如果我们估计得太草率以至于他过于偏离实际我们往往会做出错误的决定,于是我们对于某一些拿不准的时间复杂度应该稍作分析. 正解FFT............. #include <cstdio> #include <

WHYZOJ-#116[NOIP模拟] czy把妹(区间DP)

[题目描述]: Czy是个大丧失,非常喜欢bm.他经常挑战bm的极限,同时b很多的mz.(虽然也许质量不容乐观) 这一天,Czy又开始了他的极限挑战.在一个数轴上有n个maze,她们都在等待着Czy的到来.Czy一开始站在k号妹子的旁边,他需要搞定所有的妹子(由于他向fewdan学会了绝技,所以搞定妹子的时间是无限接近于0的,也就是一瞬间就搞定而不用花额外的时间).妹子们都很没有耐心,每让她们多等1s,她们就会增加w[i]的不开心值.现在,Czy从k号妹子这里出发,以1m/s的速度开始行动,他希

NOIP模拟赛 6.29

2017-6-29 NOIP模拟赛 Problem 1 机器人(robot.cpp/c/pas) [题目描述] 早苗入手了最新的Gundam模型.最新款自然有着与以往不同的功能,那就是它能够自动行走,厉害吧. 早苗的新模型可以按照输入的命令进行移动,命令包括‘E’.‘S’.‘W’.‘N’四种,分别对应东南西北.执行某个命令时,它会向对应方向移动一个单位.作为新型机器人,它可以执行命令串.对于输入的命令串,每一秒它会按命令行动一次.执行完命令串的最后一个命令后,会自动从头开始循环.在0时刻时机器人

NOIP模拟17.8.17

NOIP模拟17.8.17 A 小 G 的字符串文件名 输入文件 输出文件 时间限制 空间限制str.pas/c/cpp str.in str.out 1s 128MB[题目描述]有一天,小 L 给小 G 出了这样一道题:生成一个长度为 n 的.全由小写英文字母构成的字符串,只能使用 k 种字母.要求满足:• 字符串中相邻的两个字母不能相同.• 必须出现恰好 k 种不同的字母.这样的合法字符串可能有很多,小 L 让小 G 输出字典序最小的那个.小 G 太笨啦,不会做这道题,希望你帮帮他.[输入格

NOIP模拟17.9.22

NOIP模拟17.9.22 前进![问题描述]数轴的原点上有一只青蛙.青蛙要跳到数轴上≥ ??的位置去,但很不幸数轴上有??个区间是禁区,不能进入.青蛙会选择一个长度??,从原点开始每次向右跳长度为??的一段.一路上青蛙会停的位置是0, ??, 2??,…直到跳到了≥ ??的位置,任意一个位置都不能在禁区中.请求出??的最小值,注意??可以是实数.[输入格式]输入文件为susume.in.输入文件的第一行包含两个整数??和??,含义如问题描述中所述.接下来??行,每行描述一个禁区.每行有两个整数

NOIP模拟 17.8.18

NOIP模拟17.8.18 A.小菜一碟的背包[题目描述]Blice和阿强巴是好朋友但萌萌哒Blice不擅长数学,所以阿强巴给了她一些奶牛做练习阿强巴有 n头奶牛,每头奶牛每天可以产一定量的奶,同时也需要一定量的草作为饲料对于第 i头奶牛来说,它每天可以产 vi升的奶,同时需要 wi千克的草作为饲料现在来自蚯蚓国的九条可怜想借一些奶牛,使借走的这些奶牛每天的总产奶量最大,但九条可怜很穷,每天最多只能提供W千克的草作为饲料,而且她还需要对付跳蚤国的神刀手,所以她把这个问题交给了阿强巴,不不不……阿

NOIP模拟 6.28

NOIP模拟赛6.28 Problem 1 高级打字机(type.cpp/c/pas) [题目描述] 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序,支持如下3种操作: 1.T x:在文章末尾打下一个小写字母x.(type操作) 2.U x:撤销最后的x次修改操作.(Undo操作) (注意Query操作并不算修改操作) 3.Q x:询问当前文章中第x个字母并输出.(Query操作) 文章一开始可以视为空串. [输入格式]

【区间DP理解】LuoGu P1063/LNSYOJ#139 能量项链/LNSYOJ#157矩阵

这又是本蒟蒻一A的一道水题 题目描述 在MarsMars星球上,每个MarsMars人都随身佩带着一串能量项链.在项链上有NN颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定等于后一颗珠子的头标记.因为只有这样,通过吸盘(吸盘是MarsMars人吸收能量的一种器官)的作用,这两颗珠子才能聚合成一颗珠子,同时释放出可以被吸盘吸收的能量.如果前一颗能量珠的头标记为mm,尾标记为rr,后一颗能量珠的头标记为r,尾标记为nn,则聚合