当前位置:网站首页>codeforces k-Tree (dp still won't work)
codeforces k-Tree (dp still won't work)
2022-08-02 17:05:00 【Ask for a guide】
题目
题意: 给定一棵树,每个节点恰好有k个儿子,The corresponding edge is exactly 1-k. Find out how many options there are,The weights on the satisfying path are exactly n,And at least one edge satisfies the edge weight>=d.
思路: It is actually lineardp,Each level can only be selected1-k.好久没dp就d不出来了,可以先dp一遍1-k都能用的,再dpCan only be used once1-(d-1)的,Subtraction is what satisfies the meaning of the question.f[0][i][j]: Use all sides,从前ilayer selected,Boundary right is exactly j的方案数.Just enumerate how many weights the current layer uses,can be delivered.f[0][i][j] = f[0][i-1][j-1…k]
Only depends on the previous layer,所以可以把iThis dimension is compressed.f[0][j] = f[0][j-1…k]
时间复杂度: O(n* n * k)或O(n*k)
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 102;
const int mod = 1e9+7;
int n,m,k,T;
int f[2][N]; //0:所有边,1:小于d的边,f[j]:权值为j的方案数
void solve()
{
cin>>n>>k>>m;
f[0][0] = 1;
for(int j=1;j<=n;++j) //权值
{
for(int t=1;t<=k;++t) //Where does the enum move from
{
if(j-t<0) break;
f[0][j] = (f[0][j] + f[0][j-t]) % mod;
}
}
k = m-1;
f[1][0] = 1;
for(int j=1;j<=n;++j) //权值
{
for(int t=1;t<=k;++t) //Where does the enum move from
{
if(j-t<0) break;
f[1][j] = (f[1][j] + f[1][j-t]) % mod;
}
}
long long ans = 0;
ans = (ans + f[0][n]) % mod;
ans = (ans - f[1][n]) % mod;
ans = (ans + mod) % mod;
cout<<ans;
}
signed main(void)
{
solve();
return 0;
}
边栏推荐
猜你喜欢
随机推荐
XML和注解(Annotation)
2022-07-23 第六小组 瞒春 学习笔记
从零开始的循环之旅(上)
js中的join()方法
PAT甲级 1145 哈希 - 平均查找时间
Redis的5中数据类型总结
PAT Class A 1145 Hash - Average Lookup Time
什么是Nacos?
移除元素 - 双指针
DOM - Event Delegate
H5中的拖放(Drag 和 Drop)
数据库三范式
2022年安全员-A证考试试题及模拟考试
第六章-6.1-堆-6.2-维护堆的性质-6.3-建堆
为什么四个字节的float表示的范围比八个字节的long要广
面试了个阿里P7大佬,他让我见识到什么才是“精通高并发与调优”
【js手风琴效果案例】
XGBoost 和随机森林在表格数据上优于深度学习?
C语言的基本程序结构详细讲解
机械键盘失灵