P1220 關路燈 區間dp

2022-02-01 20:15:53 字數 1862 閱讀 6299

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

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

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

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

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

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

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

5 3

2 10

3 20

5 20

6 30

8 10

270
此時關燈順序為 \(3,4,2,1,5\)。

\(1\leq n\leq 50\),\(1\leq c\leq n\)。

首先這是乙個線性的路徑,如果只是乙個簡單的線性 \(dp\),不好儲存,所以考慮區間 \(dp\)。

當老張關完 \(i\) 到 \(j\) 的燈後,會處在 \(i\) 和 \(j\) 哪個位置呢,所以在加一維,用來表示老張所處的位置。

用 \(dp[i][j][0]\) 表示當老張關完 \(i\) 到 \(j\) 的燈後,處在 \(i\) 的位置。

用 \(dp[i][j][1]\) 表示當老張關完 \(i\) 到 \(j\) 的燈後,處在 \(j\) 的位置。

這樣就可以推出動態轉移方程:

\(dp[i][j][0]=min(dp[i+1][j][0]+time(i,i+1,i,j+1),dp[i+1][j][1]+time(i,j,i,j+1))\)

表示老張從 \(i+1\) 的位置到 \(i\) 的位置,和老張從 \(j\) 的位置到 \(i\) 的位置,並加上途中其他路燈所耗費的電,取最小值即可。

\(dp[i][j][1]=min(dp[i][j-1][0]+time(i,j,i-1,j),dp[i][j-1][1]+time(j-1,j,i-1,j))\)

表示老張從 \(j-1\) 的位置到 \(j\) 的位置,和老張從 \(i\) 的位置到 \(j\) 的位置,並加上途中其他路燈所耗費的電,取最小值即可。

#include using namespace std;

const int maxn=1000+50;

int n,k;

struct nodee[maxn];

int sum[maxn];

int dp[maxn][maxn][2];

int cala(int i1,int j1,int i0,int j0)

int main()

dp[k][k][1]=0;//初始化

dp[k][k][0]=0;

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

} printf("%d\n",min(dp[1][n][1],dp[1][n][0]));//兩種情況取最小值

return 0;

}

P1220 關路燈 (區間dp)

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

P1220 關路燈 區間DP

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

洛谷P1220 關路燈(區間dp)

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