1≤n≤1000,三角形中的数是介于 [1,100] 的正整数。
提示:如何输出方案?可以在每个位置转移 dp 时顺便记录一个 int 数组 fa 表示它是由左上角转移而来还是右上角转移而来的,然后找到最后一行的最优解的位置,依据数组 fa 倒推回到起点。例如可以这样记录: (状态转移请自行补全代码)
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= i; ++j) {
dp[i][j] = ; fa[i][j] = dp[i - 1][j] == max(dp[i - 1][j], dp[i - 1][j - 1]) ? 0 : -1;
}
倒推时,假设找到了 xp,yp 是最后一行最优解的位置,那么可以类似这样倒推来记录方案:
string plan;
while(xp > 1) { plan += fa[xp][yp] ? 'R' : 'L'; yp += fa[xp][yp], xp--; }
reverse(plan.begin(), plan.end());