【题解】[NOI2019]机器人
机器人
这题真的是太困难了……思维难度代码难度远超[联合省选2020]……
(没有想清楚就开始写,差点把自己写死了……)
35分
简单DP,这题有两种常见设状态的方式:
方式1
设\(f[l][r][h]\)表示区间\([l,r]\)内最高的柱子高度不超过\(h\)时的方案数。对于非边界情况(\(r-l+1\ge 2\)时),枚举最高的柱子最靠右的位置\(mid\in[l,r], \left||l-mid|-|mid-r|\right|\le 2\)与高度\(i\),有:
\[f[l][r][h] = \sum_{mid}\sum_{i\le h}f[l][mid-1][i]\cdot f[mid+1][r][i-1]
\]
方式2
设\(g[l][r][h]\)表示区间\([l,r]\)内最高的柱子高度恰好为\(h\)时的方案数。同理,有:
\[g[l][r][h] = \sum_{mid}f[l][mid-1][h]\cdot f[mid+1][r][h-1]
\]
50分
注意到,记忆化搜索时,实际用到的状态极少,可以用类似hash的方法保存DP值。
记忆化搜索时,可以只保存区间\([l,r]\)而不保存当前的高度限制,同时计算所有高度之后对\(g\)取前缀和得到\(f\)。
100分
注意到,\(g[l][r]\)实际上是一个分段函数,我们考虑只保存它每一段对应的多项式。则需要支持的操作有:
- 分段函数相加。
- 分段函数相乘。
- 分段函数求和。
- 分段函数求积分后向左移动一位。