题目:https://www.luogu.com.cn/problem/P1220
看了后面题解才会的这道题
https://www.luogu.com.cn/problemnew/solution/P1220
用f[i][j]表示i到j需要耗的电,因为关完i到j的时候人肯定在其中一边,所以用f[i][j][0]表示在左面1在右面
一个区间在往左扩展的时候,左边为i,上一次的边界就是i+1,扩到i时因为上一次是i+1到j,所以可能是i+1或j走过来的,所以
f[i][j][0] = min ( f[i+1][j][0] + ( a[i+1] - a[i] ) * ( sum[i] + sum[n] - sum[j] ) //i+1到i的路程乘这段时间其他所有开着的灯消耗的电
, f[i+1][j][1] + ( a[j]-a[i] ) * ( sum[i]+sum[n]-sum[j]) );
右边同理
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXM=60;
int a[MAXM],b[MAXM],sum[MAXM],n,m,c;
int f[MAXM][MAXM][2];
int min(int a,int b)//这一点希望大家注意:最好max和min函数自己写,会有效的加快程序速度
{
return a<b?a:b;}
int max(int a,int b)
{