首页 > 其他分享 >SP14846 GCJ1C09C - Bribe the Prisoners 题解

SP14846 GCJ1C09C - Bribe the Prisoners 题解

时间:2024-03-02 16:47:07浏览次数:19  
标签:int 题解 Prisoners 插入 sum GCJ1C09C 牢房 id dp

非常好区间 dp。

我们发现直接依题做是困难的,因此考虑反着做。

也即,假定起初那 \(Q\) 个牢房均为空,现在要将给定的 \(Q\) 的犯人插入其中,求最小代价。

然后我们发现这题和 P1775 很像,相当于每插入一个人,两段不相邻的牢房就被合并到了一起。

接着我们就考虑这玩意怎么做区间 dp。

状态:

令 \(dp_{i,j}\) 表示区间 \([id_i,id_j]\)(\(id_i\) 表示第 \(i\) 个空牢房的编号)的最小代价。

答案即为 \(dp_{1,Q}\)。

初始令 \(dp_{i,i}=0\),其余为 \(\infty\)。

转移:

首先按照基本套路,枚举中转点 \(k\) 将区间分为 \([i,k]\) 与 \([k+1,j]\),分别计算贡献。

然后我们在 dp 前预处理出每段牢房的人数和 \(num_i\),它的前缀和记为 \(sum_i\)。

因此合并 \(i\) 与 \(i+1\) 两端的代价即为 \(sum_i+sum_{i+1}+j-i-1\)。

上式中的 \(j-i-1\) 是除去当前插入的人之前插入的人的总和。

于是有转移方程:

\[dp_{i,j}=\min(dp_{i,j},dp_{i,k}+dp_{k+1,j}+sum_{j}-sum_{i-1}+j-i-1) \]

然后这题就做完了。

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=1e4+5;
int p,q,n;
int id[N],num[N],sum[N];
int dp[N][N];

signed main(){
	ios::sync_with_stdio(0);
	cin>>n;
	for(int t=1;t<=n;t++){
		cin>>p>>q;
		for(int i=1;i<=q;i++) cin>>id[i];
		id[++q]=p+1;
		for(int i=1;i<=q;i++) num[i]=id[i]-id[i-1]-1;
		memset(dp,0x3f,sizeof(dp));
		for(int i=1;i<=q;i++)
			dp[i][i]=0,sum[i]=sum[i-1]+num[i];
		for(int i=2;i<=q;i++){
			for(int j=1;j+i-1<=q;j++){
				int s=j,e=j+i-1;
				for(int k=s;k<=e-1;k++)
					dp[s][e]=min(dp[s][e],dp[s][k]+dp[k+1][e]);
				dp[s][e]+=sum[e]-sum[s-1]+e-s-1;
			}
		}
		cout<<"Case #"<<t<<": "<<dp[1][q]<<'\n';
	}
	return 0;
}

标签:int,题解,Prisoners,插入,sum,GCJ1C09C,牢房,id,dp
From: https://www.cnblogs.com/XOF-0-0/p/18048797

相关文章

  • 【题解】「HDU 7084」Pty loves string
    CQBZOJHDU7084不难想到把最终在\(S\)从中间分开,就变成了前后两个broder拼起来。考场重现:直接把所有的broder求出来,将相同长度的broder的下标存在一起,然后暴力匹配,最后还没来及优化。考场代码(除了fail树,其她其实都挺逼近正解正解是建出fail树(甚至搞忘还有这东......
  • 2023互联网笔试记录汇总(61道真题+题解)
    以下编程题均为博主在2023年投递实习和秋招过程中的笔试真题(共61道编程题),为避免不必要的麻烦,不对题目的来源进行说明。3.4第一题题意:给一个数组(n≤2e5),求数组内任意数对的最大差值。即对任意i<j,求最大的x[j]-x[i]。题解:处理一下前缀最小值。第二题题意:给一个数组(n≤2e5......
  • 信息传递(题解)[并查集]
    题目题目描述有n个同学(编号为1到n)正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学。游戏开始时,每人都只知道自己的生日。之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有......
  • P10187 [USACO24FEB] Palindrome Game B 题解
    挑战题解区最短代码回文数?数学题!打表找规律吧……显然,\(1\sim9\)都是回文数,先手赢(就一位你还想咋地啊)。然后是\(10\)。样例告诉我们,这个不行。接着是\(11\sim19\),发现随便减个\(1\sim9\)就可以变成\(10\),而\(10\)是后手赢。赢得就是后手的后手,那就是先手,可以。......
  • P10189 [USACO24FEB] Maximizing Productivity B 题解
    先说说暴力做法:每次遍历一遍,看看是否满足\(t_i+s\lec_i\),满足就计数,不满足就挂。单次时间复杂度显然为\(O(N)\),总得时间复杂度约为\(O(NQ)\),TLE是肯定的~暴力代码//Problem:Problem3.MaximizingProductivity//Contest:USACO-USACO2024FebruaryContest,......
  • ABC295D 题解
    萌萌思维题,但是考场差一点AC。题目等价于寻找区间\([l,r]\)满足数字\(0\)~\(9\)各出现偶数次。根据找筷子这道题的经验,出现偶数次=异或和为\(0\)。但是发现如果和找筷子一样直接异或到一起会出现冲突(例子:$3\oplus5\oplus6=0$)。所以变成二进制数就可以了。......
  • ABC321F 题解
    可撤销背包的模板题。如果没有减操作就是\(01\)背包,众所周知转移方程是\(f[i]=f[i]+f[i-v]\)。考虑减操作,对于一个重量\(i\),不选物品\(v\)的方案数是什么呢?发现我们只需要把选\(v\)的方案去掉就好,那么转移方程就是\(f[i]=f[i]-f[i-v]\)。于是就做完了。注意取模变正......
  • ABC323D 题解
    这个题笔者场上Wa了六次……首先发现一个性质:考虑单个的\(s\),它自己所能合并成的块就是\(c\)的二进制表示。例如当\(s=3,c=7\)时,显然我们可以先两两合并,得到\(3\)个\(s=6\)的,再把其中的两个合并得到一个\(s=12\)的。发现\(7=(111)_2\),正好最终只有三个块:\(s=3,......
  • P3749 题解
    P3749[六省联考2017]寿司餐厅题解发现很少有人讲为什么这题是最大权闭合子图,但作为一个刚学网络流的蒟蒻,我认为考虑是必要的。最大权闭合子图的特点:存在单向依赖关系,选\(x\)必须选\(y\)。每个点只会被选一次。代价有正有负。本问题特点:选一个区间,必选所有子区间(......
  • ABC338G 题解
    ABC338G题解计数题,没有太多思维难度,就是麻烦。显然+和*是比较难搞的,应考虑子问题。复杂度要求线性,考虑每个位置的贡献。Case1:只有数字Ex:1234考虑2的贡献,枚举一下看看。\(12=1\times10+2\times1\)\(123=1\times100+2\times10+3\times1\)\(1234=\dots\)\(2=2......