有 n n n个路灯,形成一排,一开始你在 p o s 1 pos1 pos1的位置,每个路灯都有一个功率 w i w_i wi,你的行进速度为1,问如何关路灯使得所有路灯的总功率最小,输出最小的总耗电量。
1 ≤ n ≤ 50 , 1 ≤ w i ≤ n 1 \leq n \leq 50, 1 \leq w_i \leq n 1≤n≤50,1≤wi≤n
#include
using namespace std;
const int N = 55;
int f[N][N][2], w[N], pos0, pos[N], n, sum[N];
int main(){
scanf("%d %d",&n, &pos0);
for(int i = 1; i <= n; i ++ ){
scanf("%d %d",&pos[i], &w[i]);
}
for(int i = 1; i <= n; i ++ ) sum[i] = sum[i - 1] + w[i];
memset(f, 127, sizeof f);
f[pos0][pos0][0] = f[pos0][pos0][1] = 0;
for(int i = 2; i <= n; i ++ ){
for(int j = 1; j + i - 1 <= n; j ++ ){
int ed = j + i - 1;
int x = f[j + 1][ed][0] + (pos[j + 1] - pos[j]) * (sum[j] + sum[n] - sum[ed]);
int y = f[j + 1][ed][1] + (pos[ed] - pos[j]) * (sum[j] + sum[n] - sum[ed]);
f[j][ed][0] = min(x, y);
//求f[j][ed][1] 从j - ed - 1转移
x = f[j][ed - 1][0] + (pos[ed] - pos[j]) * (sum[j - 1] + sum[n] - sum[ed - 1]);
y = f[j][ed - 1][1] + (pos[ed] - pos[ed - 1]) * (sum[j - 1] + sum[n] - sum[ed - 1]);
f[j][ed][1] = min(x, y);
}
}
printf("%d", min(f[1][n][0], f[1][n][1]));
return 0;
}