關路燈 power 解題報告

2021-07-11 20:25:14 字數 2454 閱讀 8927

源程式名       power.pas/c/cpp    可執行檔名   power.exe

輸入檔名     power.in                 輸出檔名     power.out

【問題描述】

某一村莊在一條路線上安裝了n盞路燈,每盞燈的功率有大有小(即同一段時間內消耗的電量有多有少)。老張就住在這條路中間某一路燈旁,他有一項工作就是每天早上天亮時一盞一盞地關掉這些路燈。

為了給村里節省電費,老張記錄下了每盞路燈的位置和功率,他每次關燈時也都是盡快地去關,但是老張不知道怎樣去關燈才能夠最節省電。他每天都是在天亮時首先關掉自己所處位置的路燈,然後可以向左也可以向右去關燈。開始他以為先算一下左邊路燈的總功率再算一下右邊路燈的總功率,然後選擇先關掉功率大的一邊,再回過頭來關掉另一邊的路燈,而事實並非如此,因為在關的過程中適當地調頭有可能會更省一些。

現在已知老張走的速度為1m/s,每個路燈的位置(是乙個整數,即距路線起點的距離,單位:m)、功率(w),老張關燈所用的時間很短而可以忽略不計。

請你為老張編一程式來安排關燈的順序,使從老張開始關燈時刻算起所有燈消耗電最少(燈關掉後便不再消耗電了)。

【輸入】

檔案第一行是兩個數字n(0接下來n行,每行兩個資料,表示第1盞到第n盞路燈的位置和功率。

【輸出】

乙個資料,即最少的功耗(單位:j,1j=1w·s)。

【樣例】

power.in                       

5 3                               

2 10

3 20

5 20

6 30

8 10

power.out

270 

首先看到題目,好像什麼都不知道,但是仔細一看,這是做過的題……這題的標準解答應該是dp狀態壓縮,但是在這裡先給出一種比較類似搜尋的解法

首先通過暴力可以得到從出發點開始向左走或是向右走得到乙個最優值,相當於把所有的走法都遍歷一遍,得到答案。

但是在這裡,發現這是做不了記憶化的,或者是通過剪枝剪短時間的——你會發現你根本無從去刪除,因為每一種走法都有可能在後面忽然就變優了,而且在這裡也是無法做出記憶化的,而且直接寫暴力一定會超時……

於是可以先寫出乙個暴力來,記錄每走一次,最左已經走到了**,在右邊最遠又走到了**,還有這一次在左邊還是在右邊。

寫出了這乙個暴力,你會發現,每一次記錄到最後才更改一次ans的值,那麼,能不能一邊做一邊求呢?於是,想到了另外一種思路:分治

每一次記錄的值類似上面的搜尋,那麼,可以想到,如果每一次考慮向左走和向右走得到的值,在當前情況下可以得到怎樣的值,通過遞迴,分成乙份份,比如說從c開始,是先往右邊走一步,還是先往左邊走一步,然後每一次記錄,求出向左走和向右走中比較優的值,作為當前的解法,這樣,相對之前比較難想,但是也簡單了一些。

在這個時候,就可以使用記憶化了,每一次求出值,如果當前要求的狀態之前訪問過,就直接返回值,這樣,相比之前的搜尋就要快多了。不過,這種辦法依然只是分治,但是,通過進一步改進,是可以變成dp的。

以下給出程式:

#include #include #include #include int dis[60],f[60][60][60];

int n;

int power[60];

int solve(int l,int r,int last)

if(f[l][r][last] > -1)

int ans1 = int_max,ans2 = int_max;

if(l > 1)

if(r < n)

return f[l][r][last] = std :: min(ans1,ans2);//選取較優的值}

int main()

memset(f,-1,sizeof f);

printf("%d\n",solve(k,k,k));

return 0;

}

事實上,這個方法就是通過逆向求子問題。

將原問題分解,到最左和最右的時候,會消耗多少,然後回到上乙個子問題,計算是往左邊的答案比較優,還是往右邊

如果直接暴力,就是從原點開始,向左走,向右走,會消耗多少,當最後全部走完的時候,求比較小的值

這樣做,就相當於是把原點當成是乙個子問題,然後正著推,求最優的值

雖然這樣很好想,但是很容易訪問多次子問題,而且還不能通過當前的狀態記憶化,浪費了很多時間

如果按照把原點當成最大的問題,分解成子問題,就會相對比較好算一些

同時,這樣做還可以記錄子問題的結果,避免多次訪問子問題,導致浪費時間

其實,按照這樣的思路,就可以做成是乙個dp

只不過想起來更加麻煩,需要在當前的思路上再一次逆向求一次,比較麻煩

下文將會提出乙個更優的dp

//未完待續

解題報告 關路燈

這道題我並沒有完全理解他那個蛋疼的迴圈是什麼意思,這裡只有粘一篇寫的特別棒的題解了 這是一道區間型的動態規劃題 我主要是對前方的一些dp題解補充一些小細節。既然是動規,那麼首先講一下常用的填表法和刷表法 填表法就是利用狀態轉移方程和上乙個狀態來推導出現在的狀態 相當於知道已知條件,將答案填入 刷表法...

解題報告 關路燈

這道題我並沒有完全理解他那個蛋疼的迴圈是什麼意思,這裡只有粘一篇寫的特別棒的題解了 這是一道區間型的動態規劃題 我主要是對前方的一些dp題解補充一些小細節。既然是動規,那麼首先講一下常用的填表法和刷表法 填表法就是利用狀態轉移方程和上乙個狀態來推導出現在的狀態 相當於知道已知條件,將答案填入 刷表法...

區間DP 關路燈

給你一條直線,直線上有 n 個點,每個點每秒都有消耗能量,現在再給你個點 m 代表你當前的位置,現在你要去碰這些點,當你碰到這些點時,這些點就不再消耗能量,你的速度是1m s,現在讓你求碰完這些點消耗能量最少,且最少值為多少 看了一下題,哎,這題還寫了不能用貪心,那就dp咯,還發現每次只能碰乙個點,...