A dynamic programming approach for optimizing train speed profiles with speed restrictions and passage points. (May 2017)