【題目大意】
在mars星球上,每個mars人都隨身佩帶著一串能量項鍊。在項鍊上有n
顆能量珠。能量珠是一顆有頭標記與尾標記的珠子,這些標記對應著某個正整數。並且,對於相鄰的兩顆珠子,前一顆珠子的尾標記一定等於後一顆珠子的頭標記。因為只有這樣,通過吸盤(吸盤是mars人吸收能量的一種器官)的作用,這兩顆珠子才能聚合成一顆珠子,同時釋放出可以被吸盤吸收的能量。如果前一顆能量珠的頭標記為m
,尾標記為r
,後一顆能量珠的頭標記為r
,尾標記為n
,則聚合後釋放的能量為m*r*n(mars單位),新產生的珠子的頭標記為m
,尾標記為n
。
需要時,mars人就用吸盤夾住相鄰的兩顆珠子,通過聚合得到能量,直到項鍊上只剩下一顆珠子為止。顯然,不同的聚合順序得到的總能量是不同的,請你設計乙個聚合順序,使一串項鍊釋放出的總能量最大。
例如:設n=4
,4
顆珠子的頭標記與尾標記依次為(2,3) (3,5) (5,10) (10,2)
。我們用記號 ⊕ 表示兩顆珠子的聚合操作,(j⊕k)
表示第j,k
兩顆珠子聚合後所釋放的能量。則第4、1
兩顆珠子聚合後釋放的能量為:(4⊕1) = 10*2*3=60
。
這一串項鍊可以得到最優值的乙個聚合順序所釋放的總能量為
((4⊕1)⊕2)⊕3)=10*2*3+10*3*5+10*5*10=710
。
【輸入格式】
輸入檔案energy.in的第一行是乙個正整數n(4≤n≤100)
,表示項鍊上珠子的個數。
第二行是n
個用空格隔開的正整數,所有的數均不超過1000
。第i
個數為第i
顆珠子的頭標記(1≤i≤n)
,當i至於珠子的順序,你可以這樣確定:將項鍊放到桌面上,不要出現交叉,隨意指定第一顆珠子,然後按順時針方向確定其他珠子的順序。
【輸出格式】
輸出檔案energy.out只有一行,是乙個正整數e(e<2.1*10^9),為乙個最優聚合順序所釋放的總能量。
【樣例】
樣例輸入
42 3 5 10
樣例輸出
710【思路
】這是乙個很裸的區間dp,列舉一下區間,首先列舉長度,然後列舉一下左端點,右端點。
由於本題是環,我們還要將陣列開為雙倍大小,即a[n + i] = a[i];
然後就是我們的狀態轉移方程了,即
dp[j][i] = max (dp[j][i], dp[j][k] + dp[k + 1][i] + a[j] * a[k + 1] * a[i + 1]),其實很好理解,就是原狀態和k和k+1相連所釋放的能量相比較,求出最優解
【**】
#includeusingnamespace
std;
int a[210
];int dp[210][210
];int
main()
int maxx = 1
;
for(int i = 2; i < n * 2 ; i ++)}}
cout
<< maxx
}
區間dp 能量項鍊
在mars星球上,每個mars人都隨身佩帶著一串能量項鍊。在項鍊上有n顆能量珠。能量珠是一顆有頭標記與尾標記的珠子,這些標記對應著某個正整數。並且,對於相鄰的兩顆珠子,前一顆珠子的尾標記一定等於後一顆珠子的頭標記。因為只有這樣,通過吸盤 吸盤是mars人吸收能量的一種器官 的作用,這兩顆珠子才能聚合...
區間DP 能量項鍊
在 mars 星球上,每個 mars 人都隨身佩帶著一串能量項鍊。在項鍊上有 n 顆能量珠。能量珠是一顆有頭標記和尾標記的珠子,這些標記對應著某個正整數。並且,對於相鄰的兩顆珠子,前一顆珠子的尾標記必定等於後一顆珠子的頭標記。因為只有這樣,通過吸盤 mars 人吸收能量的器官的作用,這兩顆珠子才能聚...
能量項鍊 區間DP
p1056能量項鍊 noip2006 提高組 第一道 在mars星球上,每個mars人都隨身佩帶著一串能量項鍊。在項鍊上有n顆能量珠。能量珠是一顆有頭標記與尾標記的珠子,這些標記對應著某個正整數。並且,對於相鄰的兩顆珠子,前一顆珠子的尾標記一定等於後一顆珠子的頭標記。因為只有這樣,通過吸盤 吸盤是m...