网易调整队形(动态规划)
来源:互联网 发布:nginx module 编辑:程序博客网 时间:2024/05/21 08:48
问题描述
在幼儿园有n个小朋友排列为一个队伍,从左到右一个挨着一个编号为(0~n-1)。其中有一些是男生,有一些是女生,男生用'B'表示,女生用'G'表示。小朋友们都很顽皮,当一个男生挨着的是女生的时候就会发生矛盾。作为幼儿园的老师,你需要让男生挨着女生或者女生挨着男生的情况最少。你只能在原队形上进行调整,每次调整只能让相邻的两个小朋友交换位置,现在需要尽快完成队伍调整,你需要计算出最少需要调整多少次可以让上述情况最少。例如:GGBBG -> GGBGB -> GGGBB这样就使之前的两处男女相邻变为一处相邻,需要调整队形2次输入描述:输入数据包括一个长度为n且只包含G和B的字符串.n不超过50.输出描述:输出一个整数,表示最少需要的调整队伍的次数输入例子1:GGBBG输出例子1:2
动态规划递归式
既然决定使用动态规划求解,那么最重要的就是建立递归式了: m[i]为前i个人调整为男女一处相邻的调整队伍次数; 显而易见, m[1]=0;m[2]=0; 设前i个人中最后一个人性别为pre,下一个将要加入的人性别为now,均为char类型。
动态规划递归式的分析
看完这个递归式,你肯定会有疑问:1.为什么下面两种情况表达式不同?2.m[i]+i-index什么鬼?别急,下面就来一一分析这三种情况:(1)now==pre --> m[i+1]=m[i] 假设当前串为:GGBBB,待加入的为B: 加入后:GGBBBB 那么,直接加入就好,不需要调整。(2)now!=pre --> m[i+1]=m[i] 当前串为GGGGG,待加入的为B: 加入后:GGGGGB 这种情况下,尽管 now!=pre ,也不需要调整。(3)now!=pre --> m[i+1]=m[i]+i-index 当前串为BBGGG,待加入为B: 加入后:BBBGGG 这种情况下:i=5, index=2(index代表G出现的第一个位置); 及:m[i+1]为前i个的调整次数(m[i])加上下一个加入的调整次数(i-index)。
需要记录的信息
(1)pre:前i个人中最后一个人性别(2)index:前i个中如果存在两种性别,排在后面的性别的第一次出现位置(3)now:下一个将要加入的人性别
需要说明的
由于默认第一个性别为排序在前面的性别,所以无形中我们漏掉了一种情况,及另一种性别为排序在前面的性别。(代码中会有体现)
代码
import java.util.*;public class Main{ public static int getMax(String str){ int len=str.length(); if(len<3) return 0; int[] m=new int[len+1]; m[1]=0; m[2]=0; char pre=str.charAt(1); int index=(str.charAt(0)==str.charAt(1))?-1:1; for(int i=2;i<len;i++){ char now=str.charAt(i); if(now==pre) m[i+1]=m[i]; else{ if(index==-1){ index=i; m[i+1]=m[i]; pre=now; }else{ m[i+1]=m[i]+i-index; index++; } } } return m[len]; } public static void main(String[] args){ Scanner scan=new Scanner(System.in); String str=scan.next(); int i; for(i=1;i<str.length();i++) if(str.charAt(i)!=str.charAt(0)) break; int b=Integer.MAX_VALUE; //i==str.length()为所有性别都一样的极端情况 if(i!=str.length()){ String ss=""+str.charAt(i)+str.substring(0,i)+ str.substring(i+1,str.length()); b=getMax(ss)+i; } int a=getMax(str); System.out.println(Math.min(a,b)); }}
阅读全文
0 0
- 网易调整队形(动态规划)
- 调整队形(动态规划)
- 合唱队形 动态规划
- 合唱队形-动态规划
- 动态规划--合唱队形
- 动态规划:合唱队形
- 合唱队形 动态规划
- 网易面试题——调整队形
- 2017网易实习 [编程题] 调整队形
- 网易2017 [编程题] 调整队形
- 网易2017春招笔试(调整队形)
- 网易之幼儿园小朋友调整队形
- 网易春招[编程题]调整队形
- 动态规划试题:合唱队形
- 【动态规划】【RQ478】整理队形
- 展演队形--动态规划
- 合唱队形(动态规划)
- 动态规划3:合唱队形
- 我的淘宝天猫购物返利微信机器人,不发广告,不发骚扰信息
- 【android】android中使用commons-codec框架处理各种加密解密
- 输入外挂
- 此题请去QDU找帅气的HYC与露珠
- 【03】前端面试题
- 网易调整队形(动态规划)
- yum [Errno 14] problem making ssl connection CentOs
- JZOJ3773【NOI模拟】小 P 的烦恼(拓扑排序,贪心,找桥)
- KMP
- java native 关键字
- iOS蓝牙开发 Bluetooth蓝牙CoreBluetooth 蓝牙中心设备的实现 蓝牙外设的实现 有Demo
- 测试博客链接
- 文章标题 HRBUST 1400 : 汽车比赛(树状数组 )
- hdu1081