洛谷 P1220 關路燈 區間DP

2022-01-10 18:16:29 字數 1847 閱讀 2783

某一村莊在一條路線上安裝了 n 盞路燈,每盞燈的功率有大有小(即同一段時間內消耗的電量有多有少)。老張就住在這條路中間某一路燈旁,他有一項工作就是每天早上天亮時一盞一盞地關掉這些路燈。

為了給村里節省電費,老張記錄下了每盞路燈的位置和功率,他每次關燈時也都是盡快地去關,但是老張不知道怎樣去關燈才能夠最節省電。他每天都是在天亮時首先關掉自己所處位置的路燈,然後可以向左也可以向右去關燈。開始他以為先算一下左邊路燈的總功率再算一下右邊路燈的總功率,然後選擇先關掉功率大的一邊,再回過頭來關掉另一邊的路燈,而事實並非如此,因為在關的過程中適當地調頭有可能會更省一些。

現在已知老張走的速度為 1m/s,每個路燈的位置(是乙個整數,即距路線起點的距離,單位:m)、功率(w),老張關燈所用的時間很短而可以忽略不計。

請你為老張編一程式來安排關燈的順序,使從老張開始關燈時刻算起所有燈消耗電最少(燈關掉後便不再消耗電了)。

第一行是兩個數字 n(表示路燈的總數)和 c(老張所處位置的路燈號);

接下來 n 行,每行兩個資料,表示第 1 盞到第 n 盞路燈的位置和功率。資料保證路燈位置單調遞增。

乙個資料,即最少的功耗(單位:j,1j=1w×s)。

輸入 #1

5 3

2 10

3 20

5 20

6 30

8 10

輸出 #1

此時關燈順序為 3 4 2 1 5。

1≤n≤50,1≤c≤n。

這是一道區間dp題

我們可以把老張走的路程看做一段區間,區間的兩個端點分別為\(i\),\(j\)

因為老張最後停留到\(i\)點和最後停留到\(j\)點貢獻的價值不一樣

所以我們定義\(f[i][j][0]\)為關閉區間\([i,j]\)的路燈後回到\(i\)的最小花費

\(f[i][j][1]\)為關閉區間\([i,j]\)的路燈後回到\(j\)的最小花費

同時我們定義\(wz[i]\)為第\(i\)盞路燈的位置,\(gl[i]\)為第\(i\)盞燈的功率,\(sum[i]\)為前\(i\)盞路燈的功率之和

對於\(f[i][j][0]\),它可以由\(f[i+1][j][0]\)或者\(f[i+1][j][1]\)轉移而來

\(f[i][j][0]=f[i+1][j][0]+(wz[i+1]-wz[i])*(sum[i]+sum[n]-sum[j])\)

\(f[i][j][0]=f[i+1][j][1]+(wz[j]-wz[i])*(sum[i]+sum[n]-sum[j]))\)

因此,\(f[i][j][0]=min(f[i+1][j][0]+(wz[i+1]-wz[i])*(sum[i]+sum[n]-sum[j]),f[i+1][j][1]+(wz[j]-wz[i])*(sum[i]+sum[n]-sum[j]));\)

同理,\(f[i][j][1]=min(f[i][j-1][1]+(wz[j]-wz[j-1])*(sum[i-1]+sum[n]-sum[j-1]),f[i][j-1][0]+(wz[j]-wz[i])*(sum[i-1]+sum[n]-sum[j-1]));\)

問題就迎刃而解

#includeusing namespace std;

const int maxn=55;

int f[maxn][maxn][2];

int wz[maxn],gl[maxn],sum[maxn];

int main()

for(int d=2;d<=n;d++)

}printf("%d\n",min(f[1][n][0],f[1][n][1]));

return 0;

}

洛谷P1220 關路燈(區間dp)

某一村莊在一條路線上安裝了n盞路燈,每盞燈的功率有大有小 即同一段時間內消耗的電量有多有少 老張就住在這條路中間某一路燈旁,他有一項工作就是每天早上天亮時一盞一盞地關掉這些路燈。為了給村里節省電費,老張記錄下了每盞路燈的位置和功率,他每次關燈時也都是盡快地去關,但是老張不知道怎樣去關燈才能夠最節省電...

洛谷P1220關路燈 區間dp

某一村莊在一條路線上安裝了 n 盞路燈,每盞燈的功率有大有小 即同一段時間內消耗的電量有多有少 老張就住在這條路中間某一路燈旁,他有一項工作就是每天早上天亮時一盞一盞地關掉這些路燈。為了給村里節省電費,老張記錄下了每盞路燈的位置和功率,他每次關燈時也都是盡快地去關,但是老張不知道怎樣去關燈才能夠最節...

洛谷 P1220 關路燈 區間dp

分析一下,明顯的區間dp,我們以dp i j 1 表示在i 到j的路燈已關,且老張在j點的情況下所用功耗的最小值,dp i j 0 則表示老張在i點,接著就是區間dp部分,見 include include include include includeusing namespace std con...