TopCoder SRM 589 Div2 第2题
来源:互联网 发布:ubuntu 启动 黑屏 u盘 编辑:程序博客网 时间:2024/05/18 07:13
类型: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>#include<iostream>#include<algorithm>using namespace std;#define MIN(x,y) (x)<(y)?(x):(y)const int MAX = 55;class GearsDiv2{public:int dp[MAX][2];bool first[MAX][2]; int getmin(string Directions){memset(dp,0,sizeof(dp));memset(first,0,sizeof(first));int n = Directions.length();dp[0][0] = 1;dp[0][1] = 0;first[0][0] = 1;first[0][1] = 0;for(int i=1; i<n; i++){if(dp[i-1][0] < dp[i-1][1]){dp[i][0] = dp[i-1][0]+1;first[i][0] = first[i-1][0];}else if(dp[i-1][0] > dp[i-1][1]){dp[i][0] = dp[i-1][1]+1;first[i][0] = first[i-1][1];}else {dp[i][0] = dp[i-1][1]+1;first[i][0] = first[i-1][1] | first[i-1][0];}if(Directions[i]!=Directions[i-1]){dp[i][1] = dp[i][0] - 1;first[i][1] = first[i][0];}else{dp[i][1] = dp[i-1][0];first[i][1] = first[i-1][0];}}if(n>2){if(Directions[n-1]==Directions[0] && !first[n-1][1]){dp[n-1][1]++;}}return MIN(dp[n-1][0],dp[n-1][1]);}};
- TopCoder SRM 589 Div2 第2题
- TopCoder SRM 589 Div2 第3题
- TopCoder SRM 590 Div2 第3题
- TopCoder SRM 140 Div2 第3题
- TopCoder SRM 595 Div2 第3题
- TopCoder SRM 596 Div2 第3题
- TopCoder SRM 598 Div1 第2题
- TopCoder SRM 609 Div1 第2题
- topcoder SRM 513 DIV2
- TopCoder SRM 543 DIV2
- topcoder-srm-233-div2
- Topcoder SRM Div2 Level2
- TopCoder SRM 144 div2
- TOPCODER SRM 612 DIV2
- TOPCODER SRM 613 DIV2
- topcoder-srm-613-div2
- topcoder-srm-604-div2
- topcoder-srm-595-div2
- 有用有趣的某些定义
- jquery mobile 事件 多次绑定
- 求个单片机控制双向可控硅调光电路电压220V
- 笔试or面试忘记or不懂的东西
- 设计模式:几种常见的设计模式
- TopCoder SRM 589 Div2 第2题
- 黑马程序员_java面向对象(二) 继承
- Android屏幕解锁图案破解
- ClassLoader获取的两种方式
- 化解提笔忘字依赖技术手段——汉字拼形
- 【热门主题: 高清雪景桌面壁纸】
- java 伪装成浏览器向 网站发起请求
- linux 定时备份数据资料
- android 中 系统日期时间的获取