链接:
https://codeforces.com/problemset/problem/431/C
题意:
K叉树,权重1-K,求总和n,含有大于等于D权重的路径有几条
输入
3 3 2
输出量
3
输入
3 3 3
输出量
1
输入
4 3 2
输出量
6
输入
4 5 2
输出量
7
解:
DP,两行数组第一行是没有大于等于D权重的情况,第二行是有大于等于D权重情况
转移方程
dp[【i】【0】+=dp【i-j】【0】 (j<d)
dp【i】【1】+=dp【i-j】【0】 (j>=d)
dp【i】【1】+=dp【i-j】【1]】
实际代码:
#include<iostream>
#include<cmath>
#include<algorithm>
#define mod 1000000007
using namespace std;
typedef long long int ll;
ll dp[105][5];
int main()
{
dp[0][0]=1;//第一层分支
ll n,k,d;
cin>>n>>k>>d;//n和,k叉,含有d
for(int i=1;i<=n;i++)//累积合n
{
for(int j=1;j<=k;j++)//k叉,这一步权重可以为1~k
{
//cout<<i<<"-"<<j<<endl;
if(i-j<0) break;//没有可以走的分支
else
{
if(j<d)//小于d的权重
{
dp[i][0]+=dp[i-j][0];//继承没走上D的继续没走上D
dp[i][0]%=mod;
dp[i][1]+=dp[i-j][1];//继承 走上D的加没走上D
dp[i][1]%=mod;
}
else
{
dp[i][1]+=dp[i-j][1];//继承 走上D的继续走上D的
dp[i][1]%=mod;
dp[i][1]+=dp[i-j][0];//继承 没走上D的加走上D的
dp[i][1]%=mod;
}
}
}
}
for(int i=1;i<=n;i++)
{
//cout<<dp[i][0]<<endl;
}
cout<<dp[n][1]<<endl;
}
限制:
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output