2020年广东工业大学第十届文远知行杯新生程序设计竞赛 A.肥猪的钢琴床(dp动态规划)

本文主要是介绍2020年广东工业大学第十届文远知行杯新生程序设计竞赛 A.肥猪的钢琴床(dp动态规划),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:https://ac.nowcoder.com/acm/contest/9692/A

题目描述
肥猪很喜欢睡懒觉,与此同时肥猪十分喜欢买各种各样神奇的床。

今天肥猪买了一张很宽很宽的钢琴床,肥猪就在上面滚来滚去。
这张钢琴床十分的有趣,因为它被分为n个部分,每一个部分是凸起来或者凹下去的,可是肥猪十分不喜欢相邻两个位置高低不同,因为他会滚不过去。
肥猪从小就很喜欢这样的一句谚语:猪往高处走,水往低处流,所以肥猪很喜欢凸起来的部分而不喜欢凹下去的部分。
现在肥猪可以把床中的某一些部分拿走,以让剩余部分所有凸起来的部分都是连起来的,这样肥猪就会很开心,因为他又可以滚来滚去了。
肥猪希望移除的部分最少

我们假设0表示某一个位置是凹下去的,1表示某一个位置是凸起来的。

那么
0
1
00111
01111000
11100
都是肥猪喜欢的钢琴床,因为所有凸起来的部分都是连续的

如果是
101
010011
1111101
就是肥猪不喜欢的钢琴床,因为所有凸起来的部分不是连续的
对于第一张床,肥猪可以把第二个位置拿走,这样床就变成了11。
对于第二张床,肥猪可以把第二个位置拿走,这样床就变成了00011。

输入描述:
读入一共有两行,第一行只有一个正整数数n,表示钢琴床有n个部分。
第二行由一个01串组成

  • n<=1000000
  • 保证01串的长度为n
    输出描述:
    输出一个正整数表示肥猪最少要拿走的部分的数量

示例1

输入

10
0001111000

输出

0

分析

最终要变成的01串的形式肯定是类似 00011100 这样的,那么我们可以分三段(第一段0 第二段1 第三段0)来dp:
我们定义 dp[i][0], dp[i][1], dp[i][2] 分别表示到位置 i 第一段 0 删掉了几个 1,第二段 1 删掉了几个 0 ,第三段 0 删掉了几个 1 。

我们在 dp 过程中,如果 i 位置是 0 的话:

  1. 如果它是在第一段 0 中,0 不用删去,则:dp[i][0] = dp[i - 1][0]
  2. 如果它是在第二段 1 中,则我们就要删去它,有两种情况,它可以是第二段的第一个 1 也可以不是,我们就要取小的那个值:dp[i][1] = min(dp[i - 1][0], dp[i - 1][1]) + 1
  3. 同理如果它是第三段 0 中的,不用删去,则推出:dp[i][2] = min(dp[i - 1][1], dp[i - 1][2]) + 1

i 位置是 1 的情况也同理。

代码
#include <bits/stdc++.h>
using namespace std;const int N=2e6+10;
int n;
char a[N];
int dp[N][3];void solve(){cin>>n;scanf("%s",a+1);for(int i=1;i<=n;i++){dp[i][0] = dp[i-1][0] + (a[i]-'0');dp[i][1] = min(dp[i-1][0] + '1' - a[i], dp[i-1][1] + '1' - a[i]);dp[i][2] = min(dp[i-1][1] + a[i] - '0', dp[i-1][2] + a[i] - '0');//cout<<i<<"-> "<<dp[i][0]<<" "<<dp[i][1]<<" "<<dp[i][2]<<endl;}cout<<min(dp[n][0], min(dp[n][1], dp[n][2]));
}
int main()
{int t=1;while(t--){solve();}return 0;
}

这篇关于2020年广东工业大学第十届文远知行杯新生程序设计竞赛 A.肥猪的钢琴床(dp动态规划)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/305489

相关文章

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

.NET利用C#字节流动态操作Excel文件

《.NET利用C#字节流动态操作Excel文件》在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据,本文将演示如何在.NET平台使用C#通过字节流创建,读取,编辑及保... 目录用C#创建并保存Excel工作簿为字节流用C#通过字节流直接读取Excel文件数据用C#通过字节

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

hdu4826(三维DP)

这是一个百度之星的资格赛第四题 题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1004&cid=500 题意:从左上角的点到右上角的点,每个点只能走一遍,走的方向有三个:向上,向下,向右,求最大值。 咋一看像搜索题,先暴搜,TLE,然后剪枝,还是TLE.然后我就改方法,用DP来做,这题和普通dp相比,多个个向上

hdu1011(背包树形DP)

没有完全理解这题, m个人,攻打一个map,map的入口是1,在攻打某个结点之前要先攻打其他一个结点 dp[i][j]表示m个人攻打以第i个结点为根节点的子树得到的最优解 状态转移dp[i][ j ] = max(dp[i][j], dp[i][k]+dp[t][j-k]),其中t是i结点的子节点 代码如下: #include<iostream>#include<algorithm

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

hdu4865(概率DP)

题意:已知前一天和今天的天气概率,某天的天气概率和叶子的潮湿程度的概率,n天叶子的湿度,求n天最有可能的天气情况。 思路:概率DP,dp[i][j]表示第i天天气为j的概率,状态转移如下:dp[i][j] = max(dp[i][j, dp[i-1][k]*table2[k][j]*table1[j][col] )  代码如下: #include <stdio.h>#include

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

usaco 1.1 Broken Necklace(DP)

直接上代码 接触的第一道dp ps.大概的思路就是 先从左往右用一个数组在每个点记下蓝或黑的个数 再从右到左算一遍 最后取出最大的即可 核心语句在于: 如果 str[i] = 'r'  ,   rl[i]=rl[i-1]+1, bl[i]=0 如果 str[i] = 'b' ,  bl[i]=bl[i-1]+1, rl[i]=0 如果 str[i] = 'w',  bl[i]=b