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