Algorithm 带约束图中长度为N的路径

Algorithm 带约束图中长度为N的路径,algorithm,optimization,graph,sequence,dynamic-programming,Algorithm,Optimization,Graph,Sequence,Dynamic Programming,我想在一个顶点可以是任意自然数的图中找到长度为N的路径数。然而,只有当两个顶点的乘积小于某个自然数P时,两个顶点才是连通的。如果两个顶点的乘积大于P,则两个顶点比未连通的顶点都是连通的,并且不能从另一个顶点到达 如果顶点的数量小于邻接矩阵A的帮助,我显然可以运行两个嵌套循环。因为^N中元素的总和是不同路径的数量,所以如果路径是定向的。如果不超过路径数i,则为元素之和/2。这是由于元素i,j表示从顶点i到顶点j的路径数 在这种情况下,DP也可以采用相同的方法,使用这样的推理,即从顶点v开始的长度为

我想在一个顶点可以是任意自然数的图中找到长度为N的路径数。然而,只有当两个顶点的乘积小于某个自然数P时,两个顶点才是连通的。如果两个顶点的乘积大于P,则两个顶点比未连通的顶点都是连通的,并且不能从另一个顶点到达


如果顶点的数量小于邻接矩阵A的帮助,我显然可以运行两个嵌套循环。因为^N中元素的总和是不同路径的数量,所以如果路径是定向的。如果不超过路径数i,则为元素之和/2。这是由于元素i,j表示从顶点i到顶点j的路径数

在这种情况下,DP也可以采用相同的方法,使用这样的推理,即从顶点v开始的长度为n的路径数是其所有邻居的长度为n-1的路径数之和。顶点i的邻域是从1到楼层q/i的顶点。利用这一点,我们可以构造函数Nvertex,长度表示从给定顶点到给定长度的路径数:

N(i, 1) = floor(Q/i),
N(i, n) = sum( N(j, n-1) for j in {1, ..., floor(Q/i)}.

长度的所有定向路径的数量为和Ni,N。

我同意Ante的重现性,尽管我使用了稍微简化的版本。请注意,我使用字母P来命名最大产品,因为它用于:

fi,x是以x结尾的长度为i的序列数。这个问题的答案是fn+1,1

当然,因为在这个任务中p最多可以达到10^9,所以不可能用DP表直接实现。然而,只有m<70000个不同的楼面面积/i值。那么让我们找到最大分段aj。。。bj,其中floorP/aj=floorP/bj。我们可以使用二进制搜索在段数*log P中找到这些段

想象一下f的完整DP表。由于楼板/x只有m个不同的值,因此f的每一行由m个具有相同值的连续范围组成

因此,让我们计算压缩的DP表,其中我们将行表示为长度、值对的列表。我们从f1=[P,1]开始,通过按递增顺序处理段并计算fi中存储的长度的前缀和,我们可以从fi计算fi+1

我的这种方法实现的总运行时间是Om log p+n。这是我使用的代码:

使用ll=长; 常数整数模=100000007; void addint&x,ll y{x=x+y%mod;} int main{ int n,P; cin>>n>>P; int x=1; 向量段;
如果顶点非常大怎么办?我们怎么接近呢?你是在问内存还是速度?需要的内存在Q中是线性的,如果使用部分和,运行时间是OQ*N。Pi,N=sumNj,N代表j在1到i=Pi-1,N+Ni,N。我关心时间。对于那些感兴趣的人来说,Q可以高达10^9,这是竞赛的一部分:@TheGuy with the the hat's根据我的经验,社区或多或少都同意这些问题中的计算机科学程度较低的问题在这两个地方都是关于主题的。对floorP/i可能值的观察很好。
f(1,x) = 1
f(i,x) = sum(f(i-1, y) for y in {1, ..., floor(P/x)})