submit page summary time limit: 1 sec memory limit: 128 mb submitted: 21 solved: 7
description
小x非常喜歡樹,然後他生成了乙個大森林給自己玩。
玩著玩著,小x陷入了沉思。
一棵樹由n個節點組成,編號為i的節點有乙個價值wi。
假設從樹根出發前往第i個節點(可能是樹根自己),一共需要經過di個節點(包括起點和終點),那麼這個節點對這棵樹產生的負擔就是di與wi的乘積。
對於一棵樹而言,這棵樹的負擔值為所有節點對它產生的負擔之和。
小x學習了dfs,如果他知道樹的結構,他當然可以很容易地算出樹的負擔值。可是現在沉思中的小x並不知道樹的結構形態,他只知道一棵二叉樹的中序遍歷以及每個節點的價值,那麼這棵二叉樹可能的最小負擔值是多少呢?
input
第一行為乙個正整數t(t≤20)表示資料組數。
每組資料報括三行。
第一行為乙個正整數n(n≤200)。
第二行為n個正整數wi(wi≤108),表示編號為i的節點的價值。
第三行為n個正整數pi(pi≤n),為乙個1~n的排列,表示二叉樹的中序遍歷結果。
output
對於每組資料,輸出一行乙個正整數,表示這棵樹可能的最小負擔值。
sample input
2 4
1 2 3 4
1 2 3 4
7 1 1 1 1 1 1 1
4 2 3 5 7 1 6
sample output
18 17
hint
對於第乙個樣例,樹根為3,3的左兒子是2,3的右兒子是4,2的左兒子是1,這樣構成的樹可以達到最小負擔。
對於第二個樣例,對應的滿二叉樹可以達到最小負擔。
source
2023年8月月賽
author
devember
題目大意:最優二叉搜尋樹
解題思路:定義狀態dp
[i][
j]代表在包含[i
,j] 的最優二叉搜尋樹中進行搜尋的代價。則當一棵子樹成為乙個結點的子樹時,由於每個結點的深度都增加了
1 ,所以這棵子樹代價增加值為所有權值之和,對於包含[i
,j]的子樹,所有權值之和為su
m[i]
−sum
[j−1
] 。 若r
為區間[i
,j]的根節點,則有 dp
[i][
j]=w
r+(d
p[i]
[r−1
]+su
m[r−
1]−s
um[i
−1])
+(dp
[r+1
][j]
+sum
[j]−
sum[
r])
即 dp[
i][j
]=dp
[i][
r−1]
+dp[
r+1]
[j]+
sum[
j]−s
um[i
−1]
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
const ll inf=1e18;
const
int maxn=250;
int a[maxn];//中序遍歷,左邊左子樹,右邊右子樹
ll w[maxn];
ll sum[maxn];//字首和
ll dp[maxn][maxn];//在包含[i,j]的最優二叉搜尋樹中進行搜尋的代價
int main()
sum[0]=0;
for(int i=1;i<=n;i++)
for(int l=2;l<=n;l++)
return
0;}
打家劫舍(198)
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你不觸動警報裝置的情況下 一夜之內能夠偷竊到的最高金額。示例 1 輸...
c oj分支語句例題
寫一點做完oj分支語句後的感受 1問題型別 1.判斷數正負,奇偶性,整除性。2.輸出絕對值,基本運算法則。3.輸出分段函式。2.就題論題 初學c 並不是很理解分支的內涵,所以一開始也會卡殼,會猶豫,會掉頭髮。這道題就很綜合,現在看看,也就那樣。例題描述 判斷某年是否是閏年。輸入輸入只有一行,包含乙個...
LeetCode 打家劫舍(198)
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...