洛谷P1220 關路燈

2021-10-25 04:13:20 字數 1045 閱讀 1001

區間dp,dp[i][j][0]表示關完第i到第j的燈之後在第i個燈的最小功耗,dp[i][j][1]表示關完第i到第j的燈之後在第j個燈的最小功耗。對於dp[i][j][1]一定優先是由i到j-1轉移過來功耗最小,對於dp[i][j][0]一定是由i+1到j轉移過來功耗最小。究竟有沒有在轉移時回頭我們不能確定。我們要計算出所有燈的字首和sum[i]來方便維護dp,所以狀態轉移方程為:

dp[s][e][0]=min(dp[s+1][e][0]+(x[s+1]-x[s])(sum[n]-sum[e]+sum[s]),dp[s+1][e][1]+(x[e]-x[s])(sum[n]-sum[e]+sum[s]));

dp[s][e][1]=min(dp[s][e-1][0]+(x[e]-x[s])(sum[n]-sum[e-1]+sum[s-1]),dp[s][e-1][1]+(x[e]-x[e-1])(sum[n]-sum[e-1]+sum[s-1]));

#include

using

namespace std;

const

int maxn=57;

int dp[maxn]

[maxn][5

];int sum[maxn]

;int n,c,x[maxn]

,y[maxn]

;int

main()

dp[c]

[c][0]

=dp[c]

[c][1]

=0;for

(int l=

2;l<=n;l++

)for

(int s=

1;s+l-

1<=n;s++

)printf

("%d\n"

,min

(dp[1]

[n][1]

,dp[1]

[n][0]

));return0;

}

洛谷 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 記錄...