TopCoder SRM 589 Div2 第2题

类型:DP  难度:2

题意:一堆齿轮两两相邻排成一圈,给出每个齿轮旋转方向,齿轮首尾相连,即n个齿轮,0和n-1相邻,齿轮与左右相邻的齿轮方向都相反才能转动,去掉一个齿轮,左右齿轮不看成相邻,问至少去掉几个齿轮,才能保证剩余齿轮都能按照给定方向转动。齿轮方向用L,R表示。

 

分析:dp问题,用dp[i][0]存储去掉第i个齿轮,0到i总共去掉的齿轮数最小值,dp[i][1]表示不去掉第i个齿轮,0到i总共去掉的齿轮数最小值

递推公式:dp[i][0] = min(dp[i-1][0],dp[i-1][1])+1

若当前齿轮与前一个方向不同:dp[i][0] = min(dp[i-1][0],dp[i-1][1])

否则:dp[i][1] = dp[i-1][0]

最后min(dp[n-1][0],dp[i-1][1])即为所求

但是由于齿轮是首尾相连的,所以要考虑最后一个齿轮与第一个齿轮是否是相同方向,用f[i][0]记录dp[i][0]取最小值时,第1个齿轮是否被去掉;f[i][1]记录dp[i][1]取最小值时,第1个齿轮是否被去掉

最后,若最后一个和第一个方向相同且dp[n-1][1]取最小时第一个齿轮存在,则dp[n-1][1]++,即还需去掉第一个齿轮才能转动。

代码如下:

 

#include<string>
#include<vector>
#include<cstring>
#include<map&g
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值