vijos P1180 選課 樹形dp

2021-07-14 07:20:53 字數 992 閱讀 3702

多叉的情況不好做,所以可以轉換成二叉樹.

那麼設dp[i][j]為以i為根節點的子樹上選擇j門課.

dp[i][j] = max(dp[right][j], dp[left][k - 1] +dp[right][j - k] + credit[i] | 1<= k <= j)

轉移方程時一定要注意右兒子都是兄弟不是兒子

因為轉換成了二叉樹,所以任何節點i的右節點是其多叉樹上的兄弟節點,左節點才是多叉樹的子樹.

所以dp[right][j]為把j課全部安排在兄弟節點子樹上,dp[left][k - 1]為安排一門課在i上,安排k - 1門在子數上,安排j - k門在兄弟節點子樹上.

總的複雜度為o(n^3)

** 螞蟻大戰大象

#include 

#include

#include

using

namespace

std;

const

int max =305;

vector

t[max];

int credit[max], l[max], r[max];

int dp[max][max];

int dfs(int i, int j)

return dp[i][j];

} int main(int argc, char

const *argv)

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

} }

printf("%d\n", dfs(0, m + 1));

return

0;

}

注意:輸出要用dp[0][m+1],因為多了乙個根節點0

Vijos P1180選課 解題報告

學校實行學分制。每門的必修課都有固定的學分,同時還必須獲得相應的選修課程學分。學校開設了n n 300 門的選修課程,每個學生可選課程的數量m是給定的。學生選修了這m門課並考核通過就能獲得相應的學分。在選修課程中,有些課程可以直接選修,有些課程需要一定的基礎知識,必須在選了其它的一些課程的基礎上才能...

Vijos 1180 選課 樹形dp

p1180選課 描述 學校實行學分制。每門的必修課都有固定的學分,同時還必須獲得相應的選修課程學分。學校開設了n n 300 門的選修課程,每個學生可選課程的數量m是給定的。學生選修了這m門課並考核通過就能獲得相應的學分。在選修課程中,有些課程可以直接選修,有些課程需要一定的基礎知識,必須在選了其它...

Vijos 題庫 選課 P1180

描述 學校實行學分制。每門的必修課都有固定的學分,同時還必須獲得相應的選修課程學分。學校開設了n n 300 門的選修課程,每個學生可選課程的數量m是給定的。學生選修了這m門課並考核通過就能獲得相應的學分。在選修課程中,有些課程可以直接選修,有些課程需要一定的基礎知識,必須在選了其它的一些課程的基礎...