Dynamic programming 谁能给我解释一下Topcoder Random煎饼挑战赛';SRM656中的s DP解决方案

Dynamic programming 谁能给我解释一下Topcoder Random煎饼挑战赛';SRM656中的s DP解决方案,dynamic-programming,challenge-response,Dynamic Programming,Challenge Response,挑战如下: 查理吃了N个煎饼。他想为他们中的一些人提供早餐。我们将把煎饼编号为0到N-1。对于每个i,煎饼i的宽度为i+1,美味度为d[i] Charlie使用以下随机过程选择他要供应的煎饼:他首先从他所有的煎饼中均匀随机地选择第一个煎饼。他把选定的煎饼放在盘子里。这个煎饼现在形成了未来一堆煎饼的底部。然后,Charlie重复以下步骤: 如果没有剩余的煎饼,终止。 从尚未选择的煎饼中随机均匀地选择一个煎饼。 如果此煎饼的宽度大于堆叠顶部煎饼的宽度,则终止,而不取下它。 将选定的煎饼放在堆栈顶部

挑战如下:

查理吃了N个煎饼。他想为他们中的一些人提供早餐。我们将把煎饼编号为0到N-1。对于每个i,煎饼i的宽度为i+1,美味度为d[i]

Charlie使用以下随机过程选择他要供应的煎饼:他首先从他所有的煎饼中均匀随机地选择第一个煎饼。他把选定的煎饼放在盘子里。这个煎饼现在形成了未来一堆煎饼的底部。然后,Charlie重复以下步骤:

如果没有剩余的煎饼,终止。 从尚未选择的煎饼中随机均匀地选择一个煎饼。 如果此煎饼的宽度大于堆叠顶部煎饼的宽度,则终止,而不取下它。 将选定的煎饼放在堆栈顶部,然后返回步骤1。 您将获得包含N个元素的int[]d。一份煎饼的总美味度是该份煎饼中所有煎饼的美味度之和。计算并返回Charlie选择的煎饼总美味度的期望值

这个问题涉及概率,我没有得到它的DP解