--- tags: Setup --- # Lecture 27 Setup/Prep We're going to try the optimization from last class on a problem that involves searching for an optimal solution within a constrained setting. ## Prep Familiarize yourself with the following problem: Imagine that a cafe offers multiple flavors of sweets (be they macarons, burfi, mochi, etc). Here's a sample ordering of flavors within the display case: | Chocolate | Strawberry | Vanilla | Pistachio | Raspberry | | -------- | -------- | -------- | ------- | ------ | The shop owner has an odd quirk: they won't sell adjacent flavors in the same order. For example, a customer could *not* get both a strawberry and vanilla sweet from this cafe. Users of a restaurant-review site have rated the various flavors based on tastiness. The flavors in the display case above have ratings (scale 1-20) of 3, 10, 12, 16, and 4, respectively. You are going to this cafe for the first time, and want to maximize the total (summed) rating for the sweets that you purchase. - which combinations of flavors could you purchase under the no-adjacent-flavor rule? - which would give the highest total rating? - how might you search for the highest total rating without naively generating all possible combinations and searching through the list? ::: spoiler The code (when we are ready for it) ``` =java class Macaron(val ratings: Array[Int]) { // The input is the array of ratings -- this is part of // the original data, not the array that we create // to optimize performance /** * Finds the optimal rating sublist of the Macarons. * * @param i - an int between 0 and the number of Macarons minus 1 * @return the max total rating that can be achieved using Macarons up to index i */ def maxRec(i: Int): Int = if (i == 0) this.ratings(0) else if (i == 1) if (this.ratings(0) > this.ratings(1)) this.ratings(0) else this.ratings(1) else { val twoAgo = maxRec(i - 2) val oneAgo = maxRec(i - 1) if (oneAgo > (twoAgo + this.ratings(i))) oneAgo else twoAgo + this.ratings(i) } def maxRating = maxRec(ratings.size-1) } object Main extends App { // val ratings = HashMap("Chocolate" -> 3, "Strawberry" -> 10, "Vanilla" -> 12, "Pistachio" -> 16, "Raspberry" -> 4) print(new Macaron(Array(3, 10, 12, 16, 4)).maxRating + " should be 26") ``` :::