1. 程式人生 > >Codeforce 431C - k-Tree(簡單dp計數)

Codeforce 431C - k-Tree(簡單dp計數)

題意:一顆滿二叉樹。每個點有k條邊,邊的權值為1~k,問你從root出發有多少種方案路徑綜合為n,且至少有一條邊權值大於等於於d。

思路:我們定義狀態dp[i][j][k]=1;   表示當前在第i層,當前權值和為j,k為1表示已經有大於等於k的邊 ,k為0表示還沒有大於等於k的邊 。dp[0][0][0]=1,然後就是簡單的轉移了。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dp[105][150][2];
ll mod=1e9+7;
int main()
{
	ll n,d,k;
	cin>>n>>k>>d;
	dp[0][0][0]=1;	//第i層,已經完成j,是已經有大於等於k的邊 
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<=n;j++)
		{
			for(int k1=0;k1<j;k1++)
			{
				int temp=j-k1;//當前要走的邊 
				if(temp>k) continue;
				if(temp>=d)//0->1
				{
					dp[i][j][1]+=dp[i-1][k1][0]+dp[i-1][k1][1];dp[i][j][1]%=mod;
				}
				else
				{
					dp[i][j][0]+=dp[i-1][k1][0];dp[i][j][0]%=mod;
					dp[i][j][1]+=dp[i-1][k1][1];dp[i][j][1]%=mod;
				}
			}
		}
	}
	ll ans=0;
    for(int i=1;i<=100;i++)
    {
        ans+=dp[i][n][1];
        ans%=mod;
    }cout<<ans<<endl;
	return 0;
}