多叉的情況不好做,所以可以轉換成二叉樹.
那麼設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門課並考核通過就能獲得相應的學分。在選修課程中,有些課程可以直接選修,有些課程需要一定的基礎知識,必須在選了其它的一些課程的基礎...