what you want to do is very complex, as the coursenames don't have to be adjacent, and the order of the grades doesn't have to be sorted. Crystal doesn't really do this sort of thing well. I am a thinking a delimited string of the course and the grade, then you can search the string for the course and determine if the grade is higher if so, replace the grade, then finally display the final list of courses and grades...but this fairly involved, and probably cannot be aggregated (summed/averaged).
what I would do is build a string that looks like |math^25|english^56| and then use the instr/mid functions to see if the course in the string, and to get the grade. While this sketchy, it would be alot of work to completely code the formulas, and that is what you paid to do.
Hope this gives you a path/idea/inspiration. You could probably do it via arrays as well, in which case you might be able to use a subreport.