本題是一道區間dp,很容易設計出狀態, dp[i][j]代表關掉i到j的路燈所耗的電量,但是對於新到乙個路燈來說,可以是原來直接來的,也可以是掉頭來的,於是還需要新增一維 0代表在區間的左端,1代表在區間的右端。從最開始所在的地方擴充套件。
因為涉及連續區間,可以採用字首和優化。
有如下轉移方程:
dp[i][j][1]=min(dp[i][j-1][1]+pre[i][j-1](dis[j]-dis[j-1]),dp[i][j-1][0]+pre[i][j-1](dis[j]-dis[i]));
dp[i][j][0]=min(dp[i+1][j][0]+pre[i+1][j](dis[i+1]-dis[i]),dp[i+1][j][1]+pre[i+1][j](dis[j]-dis[i]));
#include
#include
#include
#include
#include
#include
using
namespace
std;
const
int maxn=105;
int init()
while(c>='0'&&c<='9')
return fh*rv;
}int dp[maxn][maxn][2],dis[maxn],p[maxn],n,loc,pre[maxn][maxn];
int main()
for(int i=n;i>=1;i--)
pre[1][n]=0;
for(int i=1;i<=n-1;i++)
}memset(dp,0x3f,sizeof(dp));
dp[loc][loc][0]=dp[loc][loc][1]=0;
for(int i=loc;i>=1;i--)
}cout
<1][n][0],dp[1][n][1]);
fclose(stdin);
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 記錄...