首页 > 其他分享 >[ABC328G] Cut and Reorder 题解

[ABC328G] Cut and Reorder 题解

时间:2024-09-07 17:36:56浏览次数:12  
标签:Cut sta int 题解 nb ABC328G ++ dp

[ABC328G] Cut and Reorder 题解

题目不难,思维难度尚可。

首先需要发现的性质是 \(1\) 操作的次数最多只需要使用一次,使用多少次其实都是等价的。

\(n\le 22\) 显然考虑状压 dp。平凡的想法是设 \(dp_{i,j}\) 表示填数的状态为 \(i\),最后一个填的是 \(j\) 位置的数的最小代价。这样的转移复杂度是 \(O(2^nn^2)\) 的,时间和空间上都难以接受。

考虑优化 \(j\) 维度。对于每个 \(i\),我们枚举 \(j\) 之后由于其转移的特殊性,直接从 \([j,n]\) 依次转移即可。

代码:

#include <bits/stdc++.h>
#define N 22
#define int long long
using namespace std;
int n;
int a[N], b[N];
int c;
int dp[(1 << N) + 5];
vector<int>v[N];
signed main() {
	cin >> n >> c;
	for (int i = 0; i < n; i++)
		scanf("%lld", &a[i]);
	for (int i = 0; i < n; i++)
		scanf("%lld", &b[i]);
	memset(dp, 0x3f, sizeof dp);
	dp[0] = 0;
	for (int i = 0; i < (1 << n) - 1; i++) {
		int cnt = 0, x = i;
		while (x) {
			cnt += (x & 1);
			x >>= 1;
		}
		v[cnt].push_back(i);
	}
	for (int nb = 0; nb < n; nb++)
		for (auto sta : v[nb]) {
			for (int i = 0; i < n; i++)
				if (!((sta >> i) & 1)) {
					int stb = sta, sum = 0;
					for (int j = 0; j < min(n - i, n - nb); j++) {
						int x = i + j;
						if ((sta >> x) & 1)
							break;
						stb |= (1 << x);
						sum += abs(a[nb + j] - b[x]);
						if (sta)
							dp[stb] = min(dp[stb], dp[sta] + sum + c); 
						else
							dp[stb] = min(dp[stb], dp[sta] + sum); 
					}
				}
		}
	cout << dp[(1 << n) - 1] << "\n";
	return 0;
}

标签:Cut,sta,int,题解,nb,ABC328G,++,dp
From: https://www.cnblogs.com/Rock-N-Roll/p/18401942

相关文章

  • CF1991F Triangle Formation 题解
    Description你有\(n\)根棍子,从\(1\)到\(n\)编号。第\(i\)根棍子的长度是\(a_i\)。你需要回答\(q\)个问题。在每个查询中,你会得到两个整数\(l\)和\(r\)(\(1\lel<r\len,r−l+1\ge6\))。确定是否可以从编号为\(l\)到\(r\)的棒中选择\(6\)个不同的棒,形......
  • J.U.C Review - 计划任务ScheduledThreadPoolExecutor源码分析
    文章目录TimeVSScheduledThreadPoolExecutor小DemoScheduledThreadPoolExecutor类结构ScheduledThreadPoolExecutor主要方法介绍scheduleDelayed接口ScheduledFuture接口RunnableScheduledFuture接口ScheduledFutureTask类scheduleAtFixedRatescheduleWithFixedDelayd......
  • [ABC293Ex] Optimal Path Decomposition 题解
    [ABC293Ex]OptimalPathDecomposition题解是一道难得一遇的好题。对于题目中的两个限制,同时满足是困难的,于是考虑常见的套路:先固定其中一个,再计算另一个。对于本题,显然\(k\)是有单调性的,于是考虑二分这个\(k\),将最优性问题转化为可行性问题,dp路径的最小长度。那么考虑d......
  • CF1991E Coloring Game 题解
    Description有一个由\(n\)个顶点和\(m\)条边组成的无向图。每个顶点可以用三种颜色之一着色:\(1\)、\(2\)或\(3\)。初始时,所有顶点都未着色。Alice和Bob正在玩一个包含\(n\)轮的游戏。在每一轮中,都会发生以下两个步骤:Alice选择两种不同的颜色。Bob选择一个未......
  • CF2009G. Yunli's Subarray Queries 题解
    G1题目要求,对于一个子区间$a_{l\siml+k-1}$,最少要进行多少次单点修改,才能使$\forall\l<i\leql+k-1,a_i=a_{i-1}+1$,其中$k$是固定的。对于这种问题,我们通常有一个trick:将$a_i$变为$a_i-i$。这样的话,我们要求的答案就变为了$k$减去变化后的$a_{l\siml+k-1}$......
  • RecyclerView 高效使用与常见问题解决
    RecyclerView是Android应用开发中最常用的UI组件之一,通常用于显示大量数据列表。尽管功能强大,但如果使用不当,会导致性能问题、数据错乱或滚动卡顿等问题。在本篇文章中,我们将探讨RecyclerView的一些常见坑点,提供解决方案,并附带代码示例。1.坑点:ViewHolder重用导致数据错乱......
  • ctfshow web红包题第二弹题解
    从今天开始记录刷题日常打开靶场平平无奇,看源代码发现如下提示get方式提交cmd参数,猜测是命令执行漏洞,先写个phpinfo();试试。有用,但报错cerror查看显示出来部分php代码,过滤了很多东西if(preg_match("/[A-Za-oq-z0-9$]+/",$cmd)) 第一个正则表达式把字母数字几乎全......
  • [ABC137F] Polynomial Construction 题解
    明明有最厉害最好想的插值做法,怎么没有人写呢。思路考虑\(n\)个点可以确定一个\(n-1\)次多项式。如何确定。令\(l_i(x)=\prod_{j\not=i}\frac{(x-x_j)}{(x_i-x_j)}\)。可以发现这个多项式在\(x=x_i\)时值为一,在\(x=x_j(j\not=i)\)时值为零。那么就有:\[F(x)=\su......
  • 洛谷 P3034 Cow Photography G/S——题解
    洛谷P3034题解传送锚点摸鱼环节[USACO11DEC]CowPhotographyG/S题面翻译题目描述今天的奶牛们特别调皮!FarmerJohn想做的只是给排成一排的奶牛拍照,但是在他拍下照片之前,奶牛们一直在移动。具体地说,FJ有\(N\)头奶牛(\(1\leqN\leq20\,000\)),每头奶牛都有一个唯一确......
  • 题解:AT_abc369_e [ABC369E] Sightseeing Tour 详细版
    题目大意给定一个NNN个点,MMM条边的无向图。其中边有边权。有......