zoukankan      html  css  js  c++  java
  • luogu1220 关路灯

    题目大意

      路面上有一些开着的灯,每个灯有功率和它的位置,人在第c个灯处,行走速度1m/s。问怎样关灯能使耗能最小,输出这个耗能。

    思路

      

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    const int MAX_N = 60, INF = 0x3f3f3f3f;
    int F[MAX_N][MAX_N][2], Pos[MAX_N], W[MAX_N];
    int WPrefix[MAX_N];
    int N, Start;
    
    void GetWPrefix()
    {
    	for (int i = 1; i <= N; i++)
    		WPrefix[i] = WPrefix[i - 1] + W[i];
    }
    
    int DP()
    {
    	memset(F, INF, sizeof(F));
    	F[Start][Start][0] = F[Start][Start][1] = 0;
    	for (int len = 2; len <= N; len++)
    		for (int i = 1; i <= N - len + 1; i++)
    		{
    			int j = i + len - 1;
    			F[i][j][1] = min(F[i][j][1], F[i][j - 1][1] + (Pos[j] - Pos[j - 1]) * (WPrefix[i - 1] + WPrefix[N] - WPrefix[j - 1]));
    			F[i][j][1] = min(F[i][j][1], F[i][j - 1][0] + (Pos[j] - Pos[i]) * (WPrefix[i - 1] + WPrefix[N] - WPrefix[j - 1]));
    			F[i][j][0] = min(F[i][j][0], F[i + 1][j][0] + (Pos[i + 1] - Pos[i]) * (WPrefix[i] + WPrefix[N] - WPrefix[j]));
    			F[i][j][0] = min(F[i][j][0], F[i + 1][j][1] + (Pos[j] - Pos[i]) * (WPrefix[i] + WPrefix[N] - WPrefix[j]));
    		}
    	return min(F[1][N][0], F[1][N][1]);
    }
    
    int main()
    {
    	scanf("%d%d", &N, &Start);
    	for (int i = 1; i <= N; i++)
    		scanf("%d%d", Pos + i, W + i);
    	GetWPrefix();
    	printf("%d
    ", DP());
    }
    

      

  • 相关阅读:
    梯度下降算法 (转)
    机器学习
    杭电1097-A hard puzzle
    动态规划初步习题(紫书)
    4.21考试题解
    【bzoj4445 scoi2015】小凸想跑步
    【bzoj4444 scoi2015】国旗计划
    【bzoj4443 scoi2015】小凸玩矩阵
    【luogu P4007 清华集训2017】小Y和恐怖奴隶主
    【luoguP4006 清华集训2017】小Y和二叉树
  • 原文地址:https://www.cnblogs.com/headboy2002/p/9466585.html
Copyright © 2011-2022 走看看