codeforces1369D TediousLee

本文深入解析了Codeforces编号为1369/D的问题,通过分析树形结构,提出了一种从下往上的求解策略,确保获取最大值。特别讨论了在不同条件下如何选择节点以最大化结果,并提供了一个C++代码实现,展示了递归动态规划的应用。

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值