區間dp(一群屌絲進棧)

2021-08-26 09:44:04 字數 1138 閱讀 2213

題目大意:

給出n個排好隊的屌絲,每個屌絲有乙個權值,當第i個屌絲在第k個位置時,將產生乙個生氣值=(k-1)*權值,他們之間的順序可以通過乙個棧調整,問怎樣排序能使產生的生氣值之和最小。

分析:首先,這個棧有什麼用呢?它可以把乙個屌絲調整到該屌絲之後的所有位置上去。

1、狀態:區間dp,二維陣列表示區間。

2、遞推關係:入門級專題訓練中難點一般在於花費的確定,(ps:說到底好像是斷點的含義難想?):

區間長度為1時(初始值處理),dp值為零;

區間長度為2時(初始值處理),dp值取決於兩個屌絲的相對位置,好像看不出什麼規律,,,

區間長度為3時(找規律/遞推關係),dp值取決於這三個屌絲的順序,考慮這三個屌絲的順序怎麼由len=2時遞推過來呢,當第乙個屌絲在第一時,另外兩個屌絲有兩種排列方式,所以,,,總共2*3=6種排列方式。也就是說,我們列舉第乙個屌絲的位置,便可以產生區間長度為3時的某(指定區間狀態)的所有排列方式的值,然後指定區間狀態選擇排列中的最優值即可,,,

區間長度為4時(驗證遞推關係是否可推廣),是不是也用同樣的遞推關係呢?顯然,通過列舉第乙個屌絲的位置我們仍能得到區間長度為4的指定區間時所有排列方式,即狀態,同樣,對於指定區間,選擇最優值即可。

可得狀態轉移方程:

(k-i)和(k-i+1)的關係可以推算一下,直接想必然不好想。

注意:dp[i][j]所代表的只是指定區間的最優解,即i為第乙個元素,,,所以,花費那麼寫。。。

3、目標狀態:dp[1][n];

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[110][110];

ll sum[120];

ll a[120];

int main()

for(ll len=2;len<=n;++len)}}

cout<

草地,一群羊來了

前面有一片草地。打一植物 答案 梅花 沒花 前面又有一片草地。打一植物 答案 野梅花 也沒花 來了一群羊。打一水果 答案 士多啤梨 草沒 來了一群狼。打一水果 答案 楊梅 羊沒 土豆要去和包子決鬥,可是前面有一條河,他過不去。打一植物 答案 荷蘭豆 河攔豆 決鬥開始了,土豆捅了包子致命的一刀 打一食...

阿里雲有一群 「豬豬俠」

我叫喚月,是阿里雲的一名開發工程師。一般的程式設計師的日常是這樣 但我的日常是這樣 沒錯,我們就是常年在豬場敲 的阿里 豬豬俠 今年年初,阿里雲與四川特驅集團 德康集團達成合作,對et大腦針對性訓練與研發,最終全面實現人工智慧養豬。我們是人工智慧養豬的技術支援團隊,包括阿里雲和達摩院的十幾名阿里人,...

一群人出發去爬山

一群人出發去爬山,一開始大家都是意氣風發,鬥志昂揚,一路上還不斷有生力軍加入.無奈山太遠太大,爬了好久還像是在山腳徘徊.有些人累了,倦了,乏了,失望了.就說不爬了,我就在這歇著,遇到新人給他們指指路也是好的.有些人也累也倦,但坐下歇歇後,又繼續前行了,他們只是覺得出發不就是為了登頂啊,不忘初心才對。...