區間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 記錄...