Luogu P1220 關路燈 (區間dp)

2021-10-03 23:17:44 字數 2415 閱讀 2147

某一村莊在一條路線上安裝了 n

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

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

現在已知老張走的速度為 1m/

s1m/s

1m/s

,每個路燈的位置(是乙個整數,即距路線起點的距離,單位:m

mm)、功率( w

ww ),老張關燈所用的時間很短而可以忽略不計。

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

檔案第一行是兩個數字 n(1

<=n

<=50

n(1<=n<=50

n(1<=n

<=5

0,表示路燈的總數)

))和c(1

<=c

<=n

c(1<=c<=n

c(1<=c

<=n

老張所處位置的路燈號)));

接下來 n

nn 行,每行兩個資料,表示第 1

11 盞到第 n

nn 盞路燈的位置和功率。資料保證路燈位置單調遞增。

乙個資料,即最少的功耗(單位:j,1

j=1w

⋅s

j,1j=1w·s

j,1j=1

w⋅s)。

f[i]

[j][0]

=min

(f[i]

[j][0]

,f[i+1]

[j][0]

+(l[i+1]

-l[i]

)*p[i+1]

[j])

;//從i+1走到i加上走這段距離時其他燈需要的能耗是否更優

f[i]

[j][0]

=min

(f[i]

[j][0]

,f[i+1]

[j][1]

+(l[j]

-l[i]

)*p[i+1]

[j])

;//從j走到i加上走這段距離時其他燈需要的能耗是否更優

f[i]

[j][1]

=min

(f[i]

[j][1]

,f[i]

[j-1][

1]+(d[j]

-d[j-1]

)*p[i]

[j-1])

;//從j-1走到j加上走這段距離時其他燈需要的能耗是否更優

f[i]

[j][1]

=min

(f[i]

[j][1]

,f[i]

[j-1][

0]+(d[j]

-d[i]

)*p[i]

[j-1])

;//從i走到j加上走這段距離時其他燈需要的能耗是否更優

#include

using

namespace std;

int n,m;

int d[

1005

],w[

1005];

int f[

1005][

1005][

2];int p[

1005][

1005];

intmain()

for(

int i=

1;i<=n;i++

)for

(int j=i;j<=n;j++

) p[i]

[j]=w[n]

-(w[j]

-w[i-1]

);//預處理

memset

(f,10

,sizeof

(f))

; f[m]

[m][0]

=0;f[m]

[m][1]

=0;for

(int len=

2;len<=n;len++

)for

(int i=

1;i<=n-len+

1;i++

) cout <<

min(f[1]

[n][0]

,f[1

][n][1

]);//關完n盞燈後,人可以在最左邊也可以在最右邊,取最小功耗

return0;

}

P1220 關路燈 (區間dp)

題目鏈結 題解 在關完路燈 i j 時,老張要麼在 i 處,要麼在 j 處。1.要麼是在關完 j 路燈後再回頭關 i 路燈的,要麼是在關完第 i 1 盞後繼續前進關掉 i 的,在這兩種情況中選擇耗能最小的。2.要麼是在關完 i 路燈後再回頭關 j 路燈的,要麼是在關完第 j 1 盞後繼續前進關掉 j...

P1220 關路燈 區間dp

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

P1220 關路燈 區間DP

道路上有 n 盞燈,每盞燈有兩個屬性,座標和功率。老張的速度為 1m s 初始給出老張在第幾盞燈。當到達某盞燈時 老張可以花費 0 秒關掉一盞燈,確定一種路線使所有燈的耗能最小。n leq 50,1 leq c leq n 令 f i j 表示從 i 到 j 關掉 所有燈的總耗能。那麼進一步考慮,令...