Problem Statement
NOTE: This problem statement contains superscripts that may not display properly if viewed outside of the applet.
There is a horizontal row of N squares, each of which either contains a counter or is empty. A set of counters in this row is called a group if it meets all of the following requirements:
- They form a contiguous part of the row.
- The square immediately to the left of the leftmost counter in the set is empty, or the leftmost counter in the set is in the leftmost square of the row.
- The square immediately to the right of the rightmost counter in the set is empty, or the rightmost counter in the set is in the rightmost square of the row.
In one move, we can take any group and simultaneously move all of its counters one square to the right (only if the rightmost counter in the group is not in the rightmost square of the row), or one square to the left (if the leftmost counter in the group is not in the leftmost square of the row). The cost of such a move is C2, where C is the number of counters in the group.
You will be given a
Definition
- Class:
- OptimalGroupMovement
- Method:
- minimumCost
- Parameters:
- String
- Returns:
- int
- Method signature:
- int minimumCost(String board)
- (be sure your method is public)
Constraints
- board will contain between 1 and 50 characters, inclusive.
- Each character of board will be '.' or 'X'.
- At least one character of board will be 'X'.
Examples
".XXX.XXXX."
Returns: 9
Initially, there are two groups of counters: a group of 3 on the left side and a group of 4 on the right side. To form a single group, we can move the group of 3 one square to the right (at a cost of 9), or move the group of 4 one square to the left (at a cost of 16). The first option is cheaper.
"X"
Returns: 0
Here we already have one group of 1 counter.
"XXXXX...X..X.X"
Returns: 14
The leftmost group is large, so we don't move it. We move the other three groups to the left.
".X.X.X..X.X.X.......XX..X.X..X"
Returns: 70
".X"
Returns: 0
"X."
Returns: 0
"XX"
Returns: 0
"X.X"
Returns: 1
"...X...X.X.XXX..XXXX....X.X.X.X.XX.XX.X...X...XX.X"
Returns: 226
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
Returns: 0
"X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X."
Returns: 156
"XXXXXXXXXXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXX"
Returns: 576
"XXXXXXXXXXXXXXXXX................XXXXXXXXXXXXXXXXX"
Returns: 4624
"X..XXXXXXX.XXXX...XX..XX.X..XX..X.XX.....XXXXXXXX."
Returns: 1136
".X..XXXXXXX.XXX..X.X.XX.X.X....XX..XXXXXXX..X.X.XX"
Returns: 779
"X.XXXXX...XXX...X..XX.XX......X..X..X..X....XXXXXX"
Returns: 908
"XXXXXXX..X..X..X.X.XXX.XXXX.X...X....X..XXXXXXXXXX"
Returns: 1264
"XX.XXXXXXXXXXX...X..X.X.....XXXXXX..X..XXXXXXXXX.."
Returns: 1642
"XXXXXXXXX...X.X.XX..X..XX...XX..XX......XXXXXXXXXX"
Returns: 1826
".....X............................................"
Returns: 0
"...................X..........................X..."
Returns: 26
"....................X.X....X........X.X...X..X...."
Returns: 44
"..X.........X...XX........X......X.X.............X"
Returns: 80
"..X.....XX.XXXX.....X.X..XXXX....X.X.X......XX..X."
Returns: 260
"XXXXXXX.XXXXX.XXXXXX.XXXXXXXX.XX.XXXXXX..XXXXX.XXX"
Returns: 454
"XXXXXXXXXXXXXX.XXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXX"
Returns: 561
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XXXXXXXX"
Returns: 64
"....................XXXXXXXXXXXXXXXXXXXXXXX......."
Returns: 0
"X..XXXXXXXXXXXXXX.....XXXXXXX....................."
Returns: 247
"........XXXXXXX..........X.XX...XX.....XXXXXX..XXX"
Returns: 930
"..XX....XXX.XXX..XX...XX...X.XXXX.X.XX.X...XX..XXX"
Returns: 380
"..X.XXX..X.X..XX.X..X.XXX.X.XX.X..X..X..X.X.X.X.X."
Returns: 203
"X.X.X.X.X.X...X.X.XX.X..X.X.X..X.XX.XX.X.X.X.X.X.X"
Returns: 190
"X.X.XX.X.X.X.X.X.X.X.X.X.X.XX.X.X.X.X.X.X.X.X.X.X."
Returns: 177
"X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XX.X.X.X.X.X.X.X.X.X"
Returns: 163
".X.........XX....X..........."
Returns: 13
"X.X.XX....X.X..X.XXXX...XXX..XX.X.XXXXXX"
Returns: 275
"X...X.XX.X."
Returns: 6
"XXXXX.XX..X..XXXX.X.X....XX.XXX.X..XXXX.XXX"
Returns: 500
"X............"
Returns: 0
"..X.X.XXX.XXXX..XX.X"
Returns: 25
"X.........X..............XXX........."
Returns: 37
"..XXX."
Returns: 0
"X.XXXXXXXXX.XXXX.XXXXXXXXX"
Returns: 164
"XX.XXXXXXX....XXXX.X.X....X."
Returns: 89
".X.XX..X.X.XX..XXX...X.X.........X..XXX"
Returns: 201
"XX..XXX..X.X.X.XXXXXX....XXXX.XXXX.XXXX.XXXX.XXXX"
Returns: 447
"XX.XXX.XX...X.X.X..X.XXX...........XXX......"
Returns: 260
".X.XX.XXX..X...XX.X.XXX.X.X.X....XXXX.X.X"
Returns: 253
".XX.XXXX.XXXXX..XXXXX..XXXXX.XXXXXX.XX..X.X...X..."
Returns: 311
"XXXX....XXX...XXXX..XX....XXXXXXXXXX....X...XX.X"
Returns: 441
"XXX.XXX.X"
Returns: 10
"XX.....X.XX......X......XXX.X.X........XXX.....X"
Returns: 247
".....XXXXX......XXXXX......XXXXX.....XXXXX"
Returns: 575
"X..X.X.X.X..X.X.X...X....X..X.X..X.X.X..X...X"
Returns: 134
"XXXX.XXXX.X.XXXXX"
Returns: 67
".XX.XX.X."
Returns: 5
"X.XX..XXX...XXXX....XXX....XXXX...XXX...XX.X"
Returns: 351
"XXXXX.X.X.X.X................XXXXXX"
Returns: 570
"XX......X.X.X.X.X.X.X.X.X.X.X.X.X"
Returns: 86
".XX.XX.X.X..X.X.X..XXX..XX.X..X"
Returns: 106
"XXX..XXX.XXXX"
Returns: 34
"...XXX..XXX.....X...XXXXX....."
Returns: 165
"X.X...XXXXXXX.X.XX....XXX.XXX...XX..XXXXX.XXX.X..."
Returns: 580
"X....X.X"
Returns: 5
".XX..XX.X.X.X"
Returns: 14
"...XXX.....XXX..XX......XXX"
Returns: 125
".X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X"
Returns: 156
".X..XXXX.....X.X.X..X.X..XXXX.....X.X.X..X"
Returns: 252
"X.XXX...XXX..XX.X"
Returns: 42
"......XX...XX.....X..X..XX.X.X....XX..XXXX......X."
Returns: 223
".XX...XXX.XX....XXXXX.X...X.X...XXXXX"
Returns: 303
".X.X.X.X.X.X.XX."
Returns: 19
"......XX.X..XXX.....X.X....XX.X....XXXXX.X...XXX.X"
Returns: 309
"X.X.X.X.X"
Returns: 6
"XXXXXXXXXXXXXXXXX.XXXXXXXXX.XXXXXX"
Returns: 153
"XXXXXXXXXX..........XXXXXXXXXX"
Returns: 1000
"XXXXXXXX........XX........XXXXXXXX"
Returns: 1024
"X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XX"
Returns: 138
"X.XX....XX.X.XXX....X..XX...XXX...XXXXXX..X.XXXX.X"
Returns: 381
"X.X.X.X.X.X.....................................XX"
Returns: 163
"XXXX......X.XXX.X......XXXX"
Returns: 226
".XXX.XXX.XXXX."
Returns: 25
"XXX........XX..XX..XX.XX..XXXXX.....XXXXX...XX"
Returns: 360
"..X..XXXX"
Returns: 2
"XXXXXX.XXXX.X.XXXX.XXXXXX"
Returns: 176
".XX.XX.X.."
Returns: 5
".X.X.X.X.X.X.X.X.X.X.XXX.XXX.XXX.XXX.XXX.X.X.X.X"
Returns: 147
"XX.XX.XX"
Returns: 8
"XXXXXX......XXXXX.XXXXX"
Returns: 241
"X.X.X.X.X...XX"
Returns: 22
".XX...X..X..X..X..X..X..X...X...X...X...X...X...X"
Returns: 157
"XXX...XXX...XXX...XXX...XXX"
Returns: 162
"XX............................X.X.X.X.X.X.X.X.X.X"
Returns: 151
".XX..XXX.XXXX..XX..XXXX.X.X"
Returns: 104
"X.X.X.X.X.X.........XX"
Returns: 51
"X....XXXXX.......XX......XXX.....XXXX.....XX"
Returns: 480
"XXX..X.XXX.X"
Returns: 29
".XX...X.X.XX..XX....X.XX..XX.XXX..X.XX.XX.XX..X.XX"
Returns: 264
"XX..X.XX"
Returns: 12
"X.XXXX"
Returns: 1
"..XXX...X....XX...X"
Returns: 41
"..X.XX"
Returns: 1
"XX.X.X.X.X.X.X.X.X.X.X.X"
Returns: 50
"XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X"
Returns: 190
"...XXXXX..........XXXX.XXXX.XXXX"
Returns: 298
"XX..X.X.X.X.X"
Returns: 18
"X.XXXX.XXXXXX.XXXXX.XXXX.XXX.XX.X"
Returns: 121
".....XX......XXXXXX"
Returns: 24
"XXX...XX...XX...XX"
Returns: 63
"X.XXXXXXXXXXXXXXX"
Returns: 1
"XX...X...XXX"
Returns: 27
".X.X.XXX"
Returns: 3
"XXXXX.XXXX.XXXX"
Returns: 41
"XXXX.XXX.XXX"
Returns: 25
"X.XX.XXX.XXXX.XXXXX..X.XX.XXX.XXXX.XXXXX..XXXXXX"
Returns: 478
".XX....XXXXXXXX"
Returns: 16