题目传送门
解题思路:
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 }