刷題記錄(利用dfs序)

2021-10-04 20:31:44 字數 1225 閱讀 1199

題目

shy有一顆樹,樹有n個結點。有k種不同顏色的染料給樹染色。乙個染色方案是合法的,當且僅當對於所有相同顏色的點對(x,y),x到y的路徑上的所有點的顏色都要與x和y相同。請統計方案數。

一看題兩眼發懵,最終還是看題解了。利用dfs序來dp.先通過dfs確定dfs序(不用記錄回溯),之後分析一下,再選dfs序中第i個時他要麼新選乙個顏色,要麼和他父親顏色相同,而因為是dfs序,他父親已經選過。這樣得到如下遞推公式:

d[i][j]表示覆蓋dfs序前i個節點用了j種顏色

d[i][j]+=d[i-1][j-1]*(k-j+1) 選乙個新顏色

d[i][j]+=d[i-1][j] 與它父親選同乙個顏色(選完前乙個時它父親顏色已確定,所以加上d[i-1][j])

//please ac

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int maxn=

300+5;

const

int mod=

1e9+7;

int n,k,cnt=

0,pre[maxn]

,fa[maxn]

,w[maxn]

;ll d[maxn]

[maxn]

;vector<

int> mp[maxn]

;void

dfs(

int s,

int f)}}

intmain()

dfs(1,

0); d[0]

[0]=

1;for(

int i=

1;i<=n;i++)}

ll ans=0;

for(

int i=

1;i<=k;i++

)printf

("%lld\n"

,ans)

;return0;

}

Leetcode刷題記錄 53 最大子序和

小菜鳥第一次接觸動態規劃,請多包涵 給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。在這個問題中,我們將求解最大和連續子陣列分解為求解到當前...

OI刷題記錄

2014 4 18 poj3264 bzoj1699 balanced lineup rmq 2014 4 19 bzoj1012 jsoi2008 最大數maxnumber noi2004 鬱悶的出納員 bzoj3224 tyvj 1728 普通平衡樹 2014 4 20 bzoj1862 105...

面試刷題記錄

寫一段 判斷乙個包括 的表示式是否合法 注意看樣例的合法規則。給定乙個表示式a,請返回乙個bool值,代表它是否合法。測試樣例 a b 5 4 返回 true 測試樣例 a b 5 4 返回 false include vector include iostream using namespace ...