關路燈 洛谷1220 dp

2021-07-26 03:35:20 字數 2240 閱讀 8097

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

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

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

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

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

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

這題好勁a,1a**好

首先讀懂題目,這位大爺顯然是只能關與當前位置相鄰的燈的,那麼就又變成了一段數字從兩端取的模型,不同的是這是從中間往兩邊罷了

注意到題目的不同,我們的方程也要改。f[

i][j

][0]

表示i至j之間的燈都關上了,且當前大爺在i的位置上,f[

i][j

][1]

表示關燈後我們的大爺在j的位置

一開始的想法是既然要找最小功耗,那麼是不是可以變成最大節省的功?顯然是不行的,因為時間是未知的。我們可以用總的功率減去已經關上的燈i至j的功率計算功耗

還有就是,我們的大爺足夠聰明,即他不會從最左邊走去關最右邊的燈再走回最左邊,也不會從最右邊走向最左邊關掉燈然後走回去,也就是f[

i][j

][0]

只能從f[

i+1]

[j][

0或1]

轉移,另一邊同理f[

i][j

][0]

=min

(f[i

+1][

j][0

]+di

s(i,

i+1)

∗∑t=

i+1t

<=jp

[t],

f[i+

1][j

][1]

+dis

(i,j

)∗∑t

=i+1

t<=jp

[t])

f[i][j]

[1]=

min(

f[i]

[j−1

][0]

+dis

(i,j

)∗∑t

=it<=j−

1p[t

],f[

i][j

−1][

1]+d

is(j

−1,j

)∗∑t

=i+1

t<=j−

1p[t

])其中di

s(i,

j)表示路燈間的距離

#include 

#include

#include

#define rep(i, a, b) for (int i = a; i <= b; i ++)

#define fill(x, t) memset(x, t ,sizeof(x))

#define n 101

using

namespace

std;

int f[n][n][2], p[n], dis[n], sum[n], t[n];

inline

int read()

ch = getchar();

}while (ch >= '0' && ch <= '9')

return x * v;

}inline

int min(int x, int y)

inline

int dist(int i, int j)

int main(void)

fill(f, 63);

f[st][st][0] = f[st][st][1] = 0;

for (int i = st; i >= 1; i --)

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

return

0;}

洛谷P1220 關路燈(區間dp)

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

洛谷 P1220 關路燈 區間DP

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

洛谷P1220關路燈 區間dp

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