Codeforce 431C - k-Tree(簡單dp計數)
阿新 • • 發佈:2018-11-19
題意:一顆滿二叉樹。每個點有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; }