【题解】[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]\)实际上是一个分段函数,我们考虑只保存它每一段对应的多项式。则需要支持的操作有:

  1. 分段函数相加。
  2. 分段函数相乘。
  3. 分段函数求和。
  4. 分段函数求积分后向左移动一位。
posted @ 2021-05-20 21:07  frank3215  阅读(108)  评论(0编辑  收藏  举报