第二个转移方程为什么...?

P1220 关路灯

**因为我们用的是前缀和。** 举个例子。路灯功率为5,8,1,6时: ```cpp sum[0] = 0; sum[1] = 5; sum[2] = 13; sum[3] = 23; sum[4] = 29; ``` **sum[y] - sum[x] 表示的是“灯x+1”到“灯y”的功率之和。** 来分析题解。我们在题解中看到,状态是由前面已知的继承过来的,而不是主动拓展(主动,就是拿f[i][j]去拓展f[i][j+1]等等)的。下面来模拟一下,如果现在要接受继承的是f[i][j]: ___ 第一种,即循环内2~3行,从f[i+1][j]的某一端点向i走。走过来的时候,**i+1到j的灯是灭的。从全部功率(sum[n])里面减去i+1到j这几盏灯的功率,就是走过来时的耗费功率:** ```cpp sum[n] - (sum[j] - sum[i]) ``` **sum[j] - sum[i] 为“灯i+1”到“灯j”的功率之和。** (从i+1和j两个端点走过来时,时间较少的更优,结果存入f[i][j][0]) ___ 第二种,即循环内5~6行,从f[i][j-1]的某一端点向j走。走过来的时候,**i到j-1的灯是灭的。从全部功率(sum[n])里面减去i到j-1这几盏灯的功率,就是走过来时的耗费功率。** # 你的疑惑的解决: ## 根据上面说明的前缀和的作用(sum[y] - sum[x] 用于表示“灯x+1”到“灯y”的功率之和。),可得灯“i”到灯“j-1”这几盏灯的功率之和是sum[j-1] - sum[i-1]。这是灭掉的。 那么走过来时的耗费功率为: ```cpp sum[n] - (sum[j-1] - sum[i-1]) ``` **再次:sum[j-1] - sum[i-1]意思即是i到j-1这几盏灯的总功率!** ___ @[cellur925](/space/show?uid=60124)
by 学委 @ 2018-06-28 20:37:10


@[学委](/space/show?uid=49474) orz
by LanrTabe @ 2018-06-29 22:17:35


|