題意:
構造一棵有n個節點的數,f[i]表示度數(入度+出度)為i的節點的點權,給出所有的f[i],問這棵樹最大點權。
題解:
一道dp題,思維很巧妙
一共有n個點則總度數為2×(n-1),首先每個點至少也要一度則將這確定的一度先分配到每個點上,接下來還剩下n-2度沒有分配,因為度數是任意分配的,接下來我們可以把問題看做將n-2度分配任意多個n-2度,n-3度,n-4度…………1度使得分配完後權值最大,這樣看來,這不就是個完全背包麼,果然我dp學的還是差。
代碼:
#include
#include
#include
#include
using namespace std;
int n,T,f[2020],dp[4050];
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for (int i=1;i=0)
dp[j]=max(dp[j],dp[j-i]+f[i+1]);
}
cout<