區間dp(三維) 數軸餐館送餐

2021-08-27 00:00:20 字數 1324 閱讀 8671

題意:

給定餐館以及顧客位置,從餐館出發給顧客送餐,並最終回到餐館,每個顧客有乙個權值,每等一分鐘,不滿意值加對應權值,問怎樣送餐能使總的不滿意度最小。

分析:區間dp,怎麼的出來的暫且不考慮。 

考慮的餐館的相對位置,其可能處於顧客之間,也可能處於所有顧客的某一邊。對於後者,無疑按照1->2->3->4......的順序送即可,而對於前者,可以送一段左邊的顧客,在反過來送一段右邊的顧客,也可以先右邊,後左邊,還能左邊完全送完後再送右邊,或者右邊完全送完後送左邊。

然後,,,對於區間dp,我們先巨集觀考慮,想要送完1~n個顧客(最後乙個人一定是1或者n),那第n-1次送的顧客是誰,顯然,如果最後乙個人為n的話,第n-1個人可能是1,也可能是n-1,最後乙個人為1,第n-1個人可能為2或者n,所以,,,綜合考慮

我們要在(二位區間的基礎上加一維表示該區間最後乙個被送餐的人),於是也就有狀態轉移方程,

(其他的三個方程同理可得。。。略,,,)

這裡所加的權值是指我們從第i+1個人向第i個人走時其他還沒得到飯的人(包括i)所產生的生氣值,剛開始錯因在於將dp[i][j]..描述成這段區間內的人所產生的生氣值,這種描述不是不對,而是不好處理,因為這樣的話,例如從i+1到i時產生的生氣值,此時均為i的,但除了考慮i+1到i的這段距離外,還要考慮i+1~j之間行走的距離等等距離,而這些距離的計算用過推演發現是不好描述的(故,這樣不好)。而如果將狀態描述為區間外其他人產生的生氣值,那在轉移時就比較好實現了,(如**),也不必考慮在i+1~j之間行走時i所產生的生氣值(因為在較小區間中已經逐步將i的生氣值累加到總權值中了),,,,感覺沒說清楚(自己好好再想想),此時,當區間擴大到1~n時便可以得到總的生氣值,然後從最後乙個人為1或者n的狀態中中取 小者即可。

最後,長度為1的處理就不說了,長度為2,長度為3可以手推一下驗證過程,,,還有可以發現顧客均在餐廳同一邊時也是可以由上述規律實現的,只不過多了許多無用的狀態(這些多餘的都比對應區間的最優結果要大,所以對ans無影響),,,

ac**:

#include #include #include #include #include #include#include #include #include #include#include#include#define ll long long

#define inf 0x7fffffff

using namespace std;

ll dp[1100][1100][2];

struct point

a[1200];

bool cmp(point a,point b)

}cout<

}return 0;

}

杭電4501 三維dp

這到題可以算乙個三維的揹包吧 之前把題義理解錯了 以為以0積分或0錢那的就算免費的 原來不是 可以拿任意價值的。看了別人的 也學到了一點小技巧,比如dp i j max dp i 1 j dp i 1 j c i 這不是這道題的轉移方程 如果用滾動陣列要注意內迴圈的順序,但不用滾動陣列會浪費空間 所...

hdu4433 三維DP,後效性

題意 給你個長度為n的數字串,每次最多旋轉三個數字,至少經過都少部才能到達目標串。思路 一開始我也是用dp做的,但是沒考慮到後效性,所以wa了。後來看了題解,思路是這樣的dp i j k 表示第i為匹配好,第i 1位增加了j,第i 2增加了k。狀態轉移 第i 2位增加k x,第i 3位增加y,然後還...

poj1185 三維狀壓dp

description 司令部的將軍們打算在n m的網格地圖上部署他們的炮兵部隊。乙個n m的地圖由n行m列組成,地圖的每一格可能是山地 用 h 表示 也可能是平原 用 p 表示 如下圖。在每一格平原地形上最多可以布置一支炮兵部隊 山地上不能夠部署炮兵部隊 一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區...