POJ 1463 解題報告

2021-07-05 19:41:32 字數 1401 閱讀 9149

這道題是dp。之前應該做過類似的題,對每個節點根據子節點的情況進行dp,但是忘了,看了解題報告才知道這個思路。

要點在於因為本題是樹形結構,我們可以從根節點開始從上到下dp。對每個節點,有兩種可能,cover or not:如果cover了,那麼和這個節點相連的邊都覆蓋到了,所以子節點可以cover也可以不cover;如果不cover,那麼子節點必須cover。用f標記父節點,用c標記(其中乙個)子節點的話,我們有dp[f][0] = \sum_c dp[c][1]; dp[f][1] = 1 + \sum_c min(dp[c][0], dp[c][1])

其中dp[f][0]表示父節點不cover的情況,dp[f][1]表示父節點cover的情況。

thestoryofsnow

1463

accepted

292k

360ms

c++1529b

/* 

id: thestor1

lang: c++

task: poj1463

*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

const int maxn = 1500;

const int maxm = 10;

// dp[i][0] means the total number of children (and grandchildren etc) nodes covered if i itself is not covered

// dp[i][1] means i itself is covered

int dp[maxn][2];

// the number of children nodes

int nchildren[maxn];

// children nodes

int children[maxn][maxm];

void dfs(int f)

}int main()

for (int i = 0; i < n; ++i)

}// find the root who has no father node

int root = -1;

for (int i = 0; i < n; ++i)

}// printf("[debug]root:%d\n", root);

dfs(root);

printf("%d\n", min(dp[root][0], dp[root][1]));

} return 0;

}

poj 1463樹形dp入門

一道簡單的樹形dp 動態轉移方程 dp root 1 min dp id 1 dp id 0 dp root 0 dp root 1 若根節點放哨兵,則它的孩子節點有兩種選擇,若不放,呢麼他的孩子節點只有一種選擇 ac include include include include using na...

poj解題報告 1328

不得不說,這題是讓我飽受折磨,畢竟第一次做貪心演算法,而且wa了好多次,幸好有學長的幫助,最終找到了問題所在,是在快排上是問題,double高位不可向int低位轉換,由於一開始強制轉換導致雖然樣例和其他的測試資料過了,但還是wa,現在改完了就對了,附上ac ps 這題通過率是22 真心不簡單 如下 ...

poj解題報告 2586

這題我是用的貪心演算法,其實不用也可以,列舉也能解決,因為情況不多。因為是每連續5個月必有虧損,而一年只有1 5,2 6,3 7,4 8 8 12共8種情況。現在設盈餘為s,虧損為d,可列出以下幾種情況。ssssdssssdss 4ssssddsssddss 3s 2d ssdddssdddss 2...