DP专练2 (大理石 + [ZJOI 2010]数字计数)

你肯定以为DP专练会有很多题,
在这里插入图片描述
但是请考虑一下本仙女的DP码力,一次性能更几个题。。。
在这里插入图片描述
来吧,别害怕呀~~

文章目录

  • 大理石
    • 题目
    • 题解
    • 代码实现
  • 数字计数
    • 题目
    • 题解
    • 代码实现

大理石

题目

林老师是一位大理石收藏家,他在家里收藏了n块各种颜色的大理石,第i块大理石的颜色为ai。但是林老师觉得这些石头在家里随意摆放太过凌乱,他希望把所有颜色相同的石头放在一起。换句话说,林老师需要对现有的大理石重新进行排列,在重新排列之后,对于每一个颜色j,如果最左边的颜色为j的大理石是第l块大理石,最右边的颜色为j的大理石是第r块大理石,那么从第l块大理石到第r块大理石,这些石头的颜色都为j。

由于这些大理石都比较重,林老师无法承受这些大理石的重量太久,所以他每次搬运只能交换相邻的两块大理石。请问,林老师最少需要进行多少次搬运?

输入格式
第一行输入一个数字n(2≤n≤4*10^5),表示大理石的总数。
第二行输入n个数字a1,a2…,an(1≤ai≤20)表示第i块大理石的颜色为ai。
输出格式
输出林老师最少需要搬运的次数。

样例
样例输入 1
7
3 4 2 3 4 2 2
样例输出 1
3
样例输入 2
5
20 1 14 10 2
样例输出 2
0
样例输入 3
13
5 5 4 4 3 5 7 6 5 4 4 6 5
样例输出 3
21

题解

在这里插入图片描述
刚上来就这么猛滴吗!!!
我们从数据范围入手,看看n的范围,啧啧啧
明显不想让我们用暴力两两交换,O(N2)必定炸嗨,对此我只想说↓
在这里插入图片描述
再观察颜色1~20,是不是太小了,这在暗示我们什么,是什么!!
状压DP啊,wahahahaah→疯子
在这里插入图片描述

进入正解
搞成二进制,i位如果为1表示这个颜色已经被我们堆成一堆
反之则仍需处理

首先应该明白,假设i在j左边,
把i往右移到j右边,其实相当于把j左移
所以为了方便我们就统一方向,向左看(口令)~~←

本大大是枚举情况i,如果j位上面是1,
我就找到上一次状态pre,即j还未被堆在一起的状态
见代码?

if ( i & ( 1 << j ) )
pre = i - ( 1 << j )

那么DP就出来了:
dp[i]=min(dp[i],dp[pre]+cost)dp[i]=min(dp[i],dp[pre] + cost)dp[i]=min(dp[i],dp[pre]+cost)

其实这道题的难点就是如何突破这个cost
突破了就直接状压板子走一遭,路迢迢
我们直接统计i,j表示i,j两种颜色,现在要将j颜色移动到i颜色前面
cost[i][j]其实就要加上对于每一个j颜色石头所在的位置前面有多少个颜色i的石头
因为每一个j都要与它前面的每一个i交换,彼此路过,擦肩而过后的心动,好浪漫

其实刚开始我也在思考为什么是颜色个数,
而不是找到i,j位置然后加上(j-i+1)的距离

后来我想懂了,因为是两两紧紧挨着交换,
如果存在一个颜色i,另一个颜色j的两个石头,中间有其他乱入棒打鸳鸯 的颜色
那么我们也会用cost计算出i,k和j,k交换的个数,
然后再这之前又会计算出i,l和l,k直到两个石头是紧密相连,心心相通为止
而将这些相加其实就刚好是答案
在这里插入图片描述

代码实现

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define LL long long
#define MAXN 400005
#define COLOR 21
int n, Max;
int a[MAXN], tot[COLOR];
LL cost[COLOR][COLOR], dp[1 << COLOR];
int main() {scanf ( "%lld", &n );for ( int i = 1;i <= n;i ++ ) {scanf ( "%d", &a[i] );Max = max ( Max, a[i] );-- a[i];}for ( int i = 1;i <= n;i ++ ) {tot[a[i]] ++;for ( int j = 0;j < Max;j ++ )cost[j][a[i]] += tot[j];}for ( int i = 1;i < ( 1 << Max );i ++ )dp[i] = ( 1ll << 60 );dp[0] = 0;for ( int i = 0;i < ( 1 << Max );i ++ )for ( int j = 0;j < Max;j ++ )if ( i & ( 1 << j ) ) {LL val = 0;int pre = i - ( 1 << j );for ( int k = 0;k < Max;k ++ )if ( pre & ( 1 << k ) )val += cost[j][k];dp[i] = min ( dp[i], dp[pre] + val );}printf ( "%lld", dp[( 1 << Max ) - 1] );return 0;
}

数字计数

题目

给定两个正整数a 和 b,求在 [a,b] 中的所有整数中,每个数码 (digit) 各出现了多少次。

输入格式
仅包含一行两个整数a,b ,含义如上所述。
输出格式
包含一行 10个整数,分别表示 0~9 在[a,b] 中出现了多少次。

样例
样例输入
1 99
样例输出
9 20 20 20 20 20 20 20 20 20
数据范围与提示
30% 的数据中,1≤a≤b≤106
100%的数据中,1≤a≤b≤1012

题解

在这里插入图片描述
WOO!这道题,不得了,不得了,给俺整疯了!
话不多说,这道题求[a,b]一般这种区间题,我们都要用到一点点差分思想
将其转化为[1,b]−[1,a−1][1,b] - [1,a-1][1,b][1,a1]
我们先算出所有的情况个数,包含前导零,后面我们再来✂前导零
设dp[i][j][k]表示位数为i时以j开头的值为k的个数
dp[i][j][k]=dp[i][j][k]+dp[i−1][j][k]dp[i][j][k]=dp[i][j][k]+dp[i-1][j][k]dp[i][j][k]=dp[i][j][k]+dp[i1][j][k](j!=k)(j!=k)(j!=k)
dp[i][j][k]=dp[i][j][k]+dp[i−1][j][k]+pow(10,i−1))dp[i][j][k]=dp[i][j][k]+dp[i-1][j][k]+pow(10,i-1))dp[i][j][k]=dp[i][j][k]+dp[i1][j][k]+pow(10,i1))(j==k)(j==k)(j==k)
为什么要加上10i-1
简单解释:当以j开头的时候后面一共有10i-1种情况,这个时候j都作为最高位+1

最后就开始统计即可
1)统计出位数从1——最高位数len-1,这些都是满足的,
但是注意这些情况的统计都不能以0作为最高位,排除掉前导零
2)统计出位数为len,从1——len位数上的值digit[len]-1,这些也是满足的,
注意这个时候的统计,第二重循环j就可以以0开头,反正前面有len的值给我们撑腰
3)接着就是将2)情况以此类推,对于位数为i的,
固定从1——i位数上的值digit[i]-1,然后加上后面所有的0~9符合情况的个数
最后再说一个注意点:后面代码的取模操作,举例说明:
1234,固定1,就是234,1的出现次数要加上234+1,
即统计了1000~1234中的最高位1出现次数

好了,看代码吧,我口胡不行了。。。
在这里插入图片描述

代码实现

#include <cstdio>
#include <cmath>
using namespace std;
#define LL long long
#define MAXN 15
LL a, b;
LL dp[MAXN][MAXN][MAXN];
LL ans[MAXN];
int digit1[MAXN], digit2[MAXN];
int main () {scanf ( "%lld %lld", &a, &b );-- a;int num1 = 0, num2 = 0;LL t = a;while ( t ) {digit1[++ num1] = t % 10;t /= 10;}t = b;while ( t ) {digit2[++ num2] = t % 10;t /= 10;}for ( int i = 1;i <= num2;i ++ )for ( int j = 0;j <= 9;j ++ )for ( int k = 0;k <= 9;k ++ ) {for ( int Q = 0;Q <= 9;Q ++ )dp[i][j][k] += dp[i - 1][Q][k];if ( j == k ) dp[i][j][k] += ( LL ) pow ( 10, i - 1 );}if ( a ) {	for ( int i = 1;i < num1;i ++ )//所有小于num1长度的i,肯定不能以0开头 for ( int j = 1;j <= 9;j ++ )for ( int k = 0;k <= 9;k ++ )ans[k] -= dp[i][j][k];for ( int j = 1;j < digit1[num1];j ++ )for ( int k = 0;k <= 9;k ++ )ans[k] -= dp[num1][j][k];a %= ( LL ) pow ( 10, num1 - 1 );ans[digit1[num1]] -= ( a + 1 );for ( int i = num1 - 1;i > 0;i --  ) {for ( int j = 0;j < digit1[i];j ++)for ( int k = 0;k <= 9;k ++ )ans[k] -= dp[i][j][k];a %= ( LL ) pow ( 10, i - 1 );ans[digit1[i]] -= ( a + 1 );}}if ( b ) {for ( int i = 1;i < num2;i ++ )for ( int j = 1;j <= 9;j ++ )for ( int k = 0;k <= 9;k ++ )ans[k] += dp[i][j][k];for ( int j = 1;j < digit2[num2];j ++ )for ( int k = 0;k <= 9;k ++ )ans[k] += dp[num2][j][k];b %= ( LL ) pow ( 10, num2 - 1 );ans[digit2[num2]] += ( b + 1 );for ( int i = num2 - 1;i > 0;i -- ) {for ( int j = 0;j < digit2[i];j ++ )for ( int k = 0;k <= 9;k ++ )ans[k] += dp[i][j][k];b %= ( LL ) pow ( 10, i - 1 );ans[digit2[i]] += ( b + 1 );}}for ( int i = 0;i <= 9;i ++ )printf ( "%lld ", ans[i] );return 0;
} 

好了,我已经弹尽粮绝了,撤了
在这里插入图片描述在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318281.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YBTOJ:斐波拉契(矩阵快速幂)

文章目录题目描述题目描述代码题目描述 题目描述 关键在于如何转化为本题的题目。。。 设 y(1-根号5&#xff09;/2$$ 再令&#xff1a; A(n)xn yn 通过尝试可以发现&#xff0c;A其实就是一个1,3为前两项的斐波拉契数列 则 xnA(n)-yn A的值可以用矩阵快速幂来求 而y是在(-1,…

ABP 框架 数据库底层迁移 Mysql 集群

技术交流&#xff0c;请加QQ群&#xff1a;538327407我的各种github 开源项目和代码&#xff1a;https://github.com/linbin524背景笔者 目前架构的IOT 项目是使用abp 框架作为后台,虽然abp的框架适用于中小型项目框架&#xff0c;但由于架构优美&#xff0c;笔者认为还是可以经…

数论练习1 ( 曹冲养猪 + [POJ 2891]Strange Way to Express Integers + 乘法逆元【带证明】)

虽然作业还没有做完&#xff0c;但是我还是放不下它&#xff0c;对此&#xff0c;我只想说&#xff1a; 今天你对作业爱理不理&#xff0c;明天它就让你补到飞起 DP先放放&#xff0c;我们要雨露均沾练习上手&#xff1a;乘法逆元题目题解代码实现曹冲养猪?&#xff08;互质的…

开发.NET Core NuGet包并实现CI/CD

实际开发中我们需要对一些公共类库进行开发&#xff0c;并基于Jenkins进行CI/CD&#xff08;CI:持续集成&#xff0c;CD:持续部署&#xff09;,其他项目通过NuGet引用。上文讲述了如何搭建本地NuGet服务器并发布NuGet包&#xff0c;这里不再赘述。CI/CD流程如下图&#xff1a;首…

acwing221 龙哥的问题

acwing221 龙哥的问题 文章目录题目&#xff1a;题解&#xff1a;代码&#xff1a;题目&#xff1a; 题解&#xff1a; 代码&#xff1a; #include <bits/stdc.h> using namespace std; typedef long long ll;int phi(int x) {int ansx;for(int i2;(ll)i*i<x;i)if(x%…

DP专练3:征途

虽然只有1道题&#xff0c;但是含金量还是够够di 文章目录题目题解代码实现题目 题解 我们直接对答案输出格式进行处理&#xff1a;设第 iii 天走的路程为 aia_iai​&#xff0c;总路程为 S∑i1nleniS\sum_{i1}^nlen_iS∑i1n​leni​&#xff0c;那么 v∑i1m(ai−Sm)2mv∑_{i1…

云时代的.NET

编程语言从最初的0101机器码到汇编语言再到面向对象的编程&#xff0c;不断的发展&#xff0c;整个发展趋势呈现高内聚、低耦合、可重用、可理解的特点。最早编程是用机器码&#xff0c;人的大脑不像电脑&#xff0c;无法处理0101&#xff1b;后来汇编语言还是太费解&#xff0…

研究性学习:APP的隐私问题

文章目录写在前面背景&#xff08;problem&#xff09;一个实例(example)手机App用户输入隐私数据的识别与检测技术研究&#xff08;solution&#xff1f;&#xff09;&#xff08;官方&#xff09;概览背景介绍4.系统设计隐私政策引言1.收集信息2. 信息使用3. 信息披露4. 信息…

DP专练4:[SCOI 2010]股票交易(单调队列优化dp)

昨天晚上&#xff0c;初见它时&#xff0c;月黑风高&#xff0c;一个电脑&#xff0c;一支笔&#xff0c;一个人 今天秋高气爽&#xff0c;再一瞥&#xff0c;回眸间 我又来了&#xff0c;honey题目题解代码实现题目 题解 首先这种 iii 天与前面 jjj 天有关联&#xff0c;而…

【做题记录】[NOIP2016 普及组] 魔法阵

P2119 魔法阵 2016年普及组T4 题意&#xff1a; 给定一系列元素 \(\{X_i\}\) &#xff0c;求满足以下不等式的每一个元素作为 \(a,b,c,d\) 的出现次数 。 \[\begin{cases}X_a<X_b<X_c<X_d \\ X_a-X_b2\times (X_d-X_c) \\X_b-X_a<\dfrac{X_c-X_b}{3}\end{cases} \]…

“被狗啃”的按钮引发的开源社区信任危机

昨天&#xff0c;在国外民众还在欢度圣诞期间&#xff0c;开发者社区却对 Antd 开发团队发起了连番的炮轰。一觉醒来&#xff0c;他们发现由自己参与设计的、公司内网、办事系统等网页上&#xff0c;有一些按钮的上面多了一团白色的“积雪”&#xff0c;在白背景下&#xff0c;…

[COCI2017-2018#5] Pictionary(并查集+dfs)

贼ex的一道&#xff0c;卡了本仙女整整7个小时orz 思路容易理解&#xff0c;but码力very重要orz 我愿意花五毛钱提升我的码力&#xff0c;换个脑子也行&#xff0c;不换脸这张脸生得俊俏 luogu传送door 题目 在宇宙一个不为人知的地方&#xff0c;有一个星球&#xff0c;上面…

Docker最全教程——从理论到实战(九)

在本系列教程中&#xff0c;笔者希望将必要的知识点围绕理论、流程&#xff08;工作流程&#xff09;、方法、实践来进行讲解&#xff0c;而不是单纯的为讲解知识点而进行讲解。也就是说&#xff0c;笔者希望能够让大家将理论、知识、思想和指导应用到工作的实际场景和实践之中…

[2019CSP多校联赛普及组第五周] 调度CPU (贪心)

来来来&#xff0c;走过路过不要错过题目题解代码实现1代码实现2题目 ⼩Y同学有⼀块超级CPU&#xff0c;它有两个超级核⼼A和B。 A核⼼可以同时处理多项任务&#xff0c;每项任务处理时间为x&#xff0c;B核⼼只能同时处理⼀项任务&#xff0c;每项任务处理时间为y。 这⼀天…

NumSharp v0.6.1 科学计算库发布,支持标量和隐式转换

NumSharp&#xff08;Numerical .NET&#xff09;可以说是C&#xff03;中的科学计算库。 它是用C&#xff03;编写的&#xff0c;符合.netstandard 2.0库标准。 它的目标是让.NET开发人员使用NumPy的语法编写机器学习代码&#xff0c;从而最大限度地借鉴现有大量在python代码的…

[Luogu2279][HNOI2003] 消防局的设立

文章目录题目法一&#xff1a;树上DP思路代码实现法二&#xff1a;贪心 搜索思路代码实现题目 2020年&#xff0c;人类在火星上建立了一个庞大的基地群&#xff0c;总共有n个基地。起初为了节约材料&#xff0c;人类只修建了n-1条道路来连接这些基地&#xff0c;并且每两个基…

dnSpy 强大的.Net反编译软件

一说起.net的反编译软件&#xff0c;大家首先想到的就是Reflector&#xff0c;ILSpy&#xff0c;dotPeek等等。而dnSpy同样是一款优秀的反编译软件&#xff0c;同时它是开源免费的。官方的描述是: dnSpy是一个调试器和.NET组件编辑器。 即使您没有任何可用的源代码&#xff0c;…

小奇探险

文章目录题目题解代码实现题目 小奇去遗迹探险&#xff0c;遗迹里有N个宝箱&#xff0c;有的装满了珠宝&#xff0c;有的装着废品。 小奇有地图&#xff0c;所以它知道每一个宝箱的价值&#xff0c;但是它不喜欢走回头路&#xff0c;所以要按顺序拿这N个宝箱中的若干个。 拿宝…

基于Asp.Net Core打造轻量级内部服务治理RPC(二 远程服务设计)

紧接上一篇《基于Asp.Net Core打造轻量级内部服务治理RPC(一)》文章。本文主要讲解基于Asp.Net Core的远程服务设计和实现。在上一篇中讲过,服务提供者提供的服务实际上就是一个Controller&#xff0c;那么是否在该程序中&#xff0c;服务都按照Asp.Net Core 中的Web Api的方式…

[NOIP 2009 提高组]最优贸易

勤劳的一更题目题解代码实现题目 C国有 n个大城市和 m 条道路&#xff0c;每条道路连接这n个城市中的某两个城市。任意两个城市之间最多只有一条道路直接相连。这 m 条道路中有一部分为单向通行的道路&#xff0c;一部分为双向通行的道路&#xff0c;双向通行的道路在统计条数…