(這三個字寫這麼大完全是為了提醒自己 hhhh 竟然這都不會)
樹形dp;
不懂得如何推出狀態表示式 (即使再簡單)看見題目就無從下手!!!有點煩
所以決定多刷一點dp題,
先看了最基礎的:
洛谷p1352
這個題其實挺簡單的,但是我是真的廢。。。
題意:給出一棵樹,每個節點有自己的權值,選擇出一些點,選擇點的時候如果選擇了當前節點的父節點則不能選擇當前節點,這很顯然的樹形dp,可能是我做dp題目太少了吧,連dp陣列都不知道該代表點啥。
於是看了題解。
dp[i][0] 代表這顆子樹不選 i 節點 能選出的最大權值。
dp[i][1] 代表這顆子樹上選擇 i 節點能選出的最大權值。
於是得到轉移方程:
dp[i][0] += max(dp[v][0],dp[v][1]);
dp[i][1] += dp[v][0]; dp[i][1] += val[i];
(這裡v是 i 的子節點)
上**:
#include
#include
#include
using
namespace std;
const
int maxn =
6005
;int val[maxn]
;int du[maxn]
;vector<
int> vv[maxn]
;int dp[maxn][2
];void
dfs(
int x)
}int
main()
for(
int i =
1; i < n; i ++
)int r;
for(
int i =
1; i <= n; i ++)}
dfs(r)
;printf
("%d\n"
,max
(dp[r][0
],dp[r][1
]));
}
一道簡單DP題
首先,一看就應該知道這是一道dp題。原因在於其當前結果都依賴於前面計算得到的子結果。區分分治和dp的關鍵條件就在於演算法執行中間階段的計算結果是否依賴於其子問題的結果,若依賴則為dp,否則為分治。dp題的關鍵在於找出狀態轉移方程和初始條件 或者稱為邊界值 找出狀態轉移方程的關鍵又在於找對乙個狀態函式...
記一道DP題
給定 n l r 求長度為n的 且元素在 l r 的 且 陣列元素和是3的倍數的 陣列的 個數 dpmod0 表示區間內的數mod 3 0的個數 mod1 mod2 同理 dp i j 表示 長度為i的 陣列元素mod 3 為 j 的陣列的個數 如果 i 1長度的陣列和 mod 3 0 那麼我再加乙...
DP 一道遞推題。。。
bob想要構造一張由n個節點構成的圖。構造的過程由兩步組成 首先bob會取出n個孤立的點,並把它們從1到n編號,然後對每個節點用一種顏色染色,bob一共可以使用k種不同的顏色。接下來bob會在這張圖中加入一些有向邊,對於每乙個編號範圍在 2,n 的節點i,bob有可能選擇乙個節點j滿足j i並且節點...