區間DP 關路燈

2022-07-16 14:00:17 字數 849 閱讀 2665

給你一條直線,直線上有\(n\)個點,每個點每秒都有消耗能量,現在再給你個點\(m\),代表你當前的位置,現在你要去碰這些點,當你碰到這些點時,這些點就不再消耗能量,你的速度是1m/s,現在讓你求碰完這些點消耗能量最少,且最少值為多少

看了一下題,哎,這題還寫了不能用貪心,那就dp咯,還發現每次只能碰乙個點,那似乎可以用區間動規\(dp_\)來表示我們目前的狀態,代表已經碰了 \(i, j\) 這個區間的點時所消耗的最小能量,用小區間去合成大區間,每次又給你你得停留在哪邊,兩個狀態肯定不夠,再設乙個狀態 \(dp_\) 表示走了 \(i, j\) 區間後在哪邊。

因為有消耗,為了很快的計算這個消耗,我們可以用字首和維護,然後套模板就好了?

推導公式如下

太長了 寫了半天發現並沒有空間解釋 我直接寫在**裡面吧

//#define fre yes

#include #include #include const int n = 105;

int place[n], p[n], sum[n];

int f[n][n][2];

int main()

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

memset(f, 1, sizeof(f));

f[m][m][0] = f[m][m][1] = 0;

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

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

//最後的狀態不知道哪邊更小 比一下

return 0;

}

P1220 關路燈 (區間dp)

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

Luogu P1220 關路燈 (區間dp)

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

P1220 關路燈 區間dp

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