**因为我们用的是前缀和。**
举个例子。路灯功率为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