codeforces1369D TediousLee

https://codeforces.com/problemset/problem/1369/D

一眼結論,從這棵樹從下往上,能取就取,肯定能得到最大值,因爲兒子數量更多一些,如果取父節點會影響很多子樹。

然後再考慮,i=3,只能取跟節點的1個爪子,i=4的時候,從下往上取,取中間的爪子,根節點不會被取,i=5的時候,也不會取根節點

然後可以發現 對於level i , 由3棵子樹+1個根節點形成,其中2棵i-2的樹,1棵i-1的樹

那麼如果i-2和i-1都不取根節點,也就是i的根節點的子節點,那麼根節點這裏就可以在子樹都取完最大值的基礎上多取一個爪子。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int maxl=2e6+10;
const int mod=1e9+7;

int n,m,cas,k,cnt,tot,ans;
char s[maxl];
bool in[maxl]; 
ll dp[maxl];

inline void prework()
{
	scanf("%d",&n);
} 

inline void mainwork()
{
	
}

inline void print()
{
	printf("%lld\n",4*dp[n]%mod);
}

int main()
{
	dp[1]=0;dp[2]=0;dp[3]=1;
	for(int i=4;i<maxl;i++)
	if(i%3==0)
		dp[i]=(2*dp[i-2]+dp[i-1]+1)%mod;
	else
		dp[i]=(2*dp[i-2]+dp[i-1])%mod;
	int t=1;
	scanf("%d",&t);
	for(cas=1;cas<=t;cas++)
	{
		prework();
		mainwork();
		print();
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章