有 n 個西瓜,編號為 0
00 到 n−1
n-1n−
1 ,每個西瓜上都標有乙個數字,這些數字存在陣列 num
snums
nums
中。現在要求你戳破所有的西瓜。每當你戳破乙個西瓜i
ii時,你可以獲得 num
s[le
ft]∗
nums
[i]∗
nums
[rig
ht
]nums[left]*nums[i]*nums[right]
nums[l
eft]
∗num
s[i]
∗num
s[ri
ght]
個硬幣。這裡的 lef
tleft
left
和 righ
tright
righ
t 代表和 i
ii 相鄰的兩個西瓜的序號。注意當你戳破了西瓜 i
ii 後,西瓜 lef
tleft
left
和西瓜 rig
ht
right
righ
t 就變成了相鄰的西瓜。求所能獲得硬幣的最大數量。
資料範圍與提示:
::你可以假設 num
s[−1
]=nu
ms[n
]=
1nums[-1]=nums[n]=1
nums[−
1]=n
ums[
n]=1
,但注意它們不是真實存在的西瓜,所以並不能被戳破。
假設 dp[
i][j
]dp[i][j]
dp[i][
j]表示開區間 (i,
j)
(i,j)
(i,j
) 內你能拿得最多的硬幣。
那麼在這個情況下(i,
j)
(i,j)
(i,j
)開區間得到的金幣可以由 dp[
i][j
]dp[i][j]
dp[i][
j]和 dp[
k][j
]dp[k][j]
dp[k][
j]進行轉移,如果你此刻選擇戳爆 k
kk ,那麼你得到的金幣數量就是dp[
i][k
]+nu
ms[i
]∗nu
ms[k
]∗nu
ms[j
]+dp
[k][
j]
dp[i][k]+nums[i]*nums[k]*nums[j]+dp[k][j]
dp[i][
k]+n
ums[
i]∗n
ums[
k]∗n
ums[
j]+d
p[k]
[j]
#include .h>
using namespace std;
const
int m =
505;
int a[m]
, dp[m]
[m];
int n;
intmain()
}printf
("%d"
, dp[0]
[m -1]
);return0;
}
To Heart 題解 戳西瓜
請不要吝嗇你的點讚!有 n 個西瓜,編號為0 到 n 1,每個西瓜上都標有乙個數字,這些數字存在陣列 nums 中。現在要求你戳破所有的西瓜。每當你戳破乙個西瓜 i 時,你可以獲得 nums left nums i nums right 個硬幣。這裡的 left 和 right 代表和 i 相鄰的兩...
區間DP 戳西瓜(c )
前言 今天中午筆者立下了乙個flag帖,晚自習的筆者來解決flag了!參考題解 題目描述 有 n 個西瓜,編號為0 到 n 1,每個西瓜上都標有乙個數字,這些數字存在陣列 nums 中。現在要求你戳破所有的西瓜。每當你戳破乙個西瓜 i 時,你可以獲得 nums left nums i nums ri...
生西瓜,熟西瓜
終於又可以有抱上幾天兒子了。想著讓兒子吃點新鮮的水果,所以給他和家人買了些西瓜。記憶中西瓜還要在過幾個周才能下來。但是成車的西瓜現在已經擺到了門口。買了兩個,花了24元錢 1.3元 斤 真是不便宜。誰讓中國人好吃個鮮呢,這會的西瓜貴些還是有道理的。等切開西瓜,發現和前段時間同事買的西瓜很類似,總是半...