洛谷P1220 關路燈

2022-05-19 10:31:35 字數 919 閱讀 7846

題目大意:有n盞燈,每盞燈有功耗和位置。乙個人在第c盞燈處,要關閉所有燈,問燈在關閉前總功耗為多少。

解題思路:dp。

首先我們可以知道,關的燈總是乙個連續的區間,因為如果中間空了乙個燈,還不如走過去時順便關了它。

其次,關掉乙個區間的燈後,人總是在區間最左邊或最右邊。

那麼我們設f[i][j][0]表示關掉i~j這些燈後站在左端的最小功耗,f[i][j][1]表示關掉i~j這些燈後站在右端的最小功耗。

那麼有f[i][j][0]=min(f[i+1][j][0]+(a[i+1]-a[i])*(sum[n]-(sum[j]-sum[i])),f[i+1][j][1]+(a[j]-a[i])*(sum[n]-(sum[j]-sum[i])))

f[i][j][1]=min(f[i][j-1][0]+(a[j]-a[i])*(sum[n]-(sum[j-1]-sum[i-1])),f[i][j-1][1]+(a[j]-a[j-1])*(sum[n]-(sum[j-1]-sum[i-1])))

於是最後答案為min(f[1][n][0],f[1][n][1])。

c++ code:

#include#includeusing namespace std;

int f[55][55][2],n,c,sum[55];

int a[55];

inline int min(int x,int y)

int main()

f[c][c][0]=f[c][c][1]=0;

for(int i=1;i<=n;++i)

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

return 0;

}

洛谷 P1220 關路燈

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

洛谷 P1220 關路燈

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

洛谷 P1220 關路燈

原本想用搜尋先超時一把 然後發現剪枝居然過了 include include include include include include using namespace std int d 10005 記錄燈的功率 int lef,righ,minx int run int x,int y 記錄...