洛谷 P1220 关路灯

题目传送门

解题思路:

f[i][j][0]表示i~j区间的灯全部被关了,当前站在i.

f[i][j][1]表示i~j区间的灯全部被关了,当前站在j.

剩下在代码里.

AC代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 
 6 using namespace std;
 7 
 8 int n,c,a[51],v[51],sum[51],f[51][51][2];
 9 
10 int main() {
11     scanf("%d%d",&n,&c);
12     for(int i = 1;i <= n; i++) {
13         scanf("%d%d",&a[i],&v[i]);
14         sum[i] = sum[i-1] + v[i];
15     }
16     memset(f,0x3f3f,sizeof(f)); 
17     f[c][c][1] = f[c][c][0] = 0;
18     for(int len = 1;len < n; len++)
19         for(int i = 1,j = len + i;j <= n; i++,j++) {
20             f[i][j][0] = min(f[i+1][j][0] + (a[i+1] - a[i]) * (sum[i] + sum[n] - sum[j]),f[i+1][j][1] + (a[j] - a[i]) * (sum[n] - sum[j] + sum[i]));
21             //从i+1走过来,或从j走过来关i 
22             f[i][j][1] = min(f[i][j-1][1] + (a[j] - a[j-1]) * (sum[i-1] + sum[n] - sum[j-1]),f[i][j-1][0] + (a[j] - a[i]) * (sum[i-1] + sum[n] - sum[j-1]));
23             //从j-1走过来,或从i走过来关j 
24         }
25     printf("%d",min(f[1][n][0],f[1][n][1]));
26     return 0;
27 }
原文地址:https://www.cnblogs.com/lipeiyi520/p/12247068.html