首页 > cf 414B Mashmokh and ACM 动态规划

cf 414B Mashmokh and ACM 动态规划

题目链接:http://codeforces.com/problemset/problem/414/B

 

dp[i][j]表示长度为i、最后一个数字为j的合法序列总数

dp[1][1...2000]都是1

后面用dp[i-1][j] 去更新 dp[i][j*t] (1 <= j*t <= 2000) 即用因子去更新它的倍数

表面上看是2000^3的复杂度会爆 其实不用算那么多次

最外层循环是2000

分析第二层和第三层 需要算 2000/1 + 2000/2 + 2000/3 + 2000/4 + ... + 2000/2000 次

即2000 * (1/1 + 1/2 + 1/3 + ... + 1/2000)

后面的括号是一个【调和级数】 利用高等数学知识可知 它是有上限的 为自然对数e

所以本算法的时间复杂度实际上仅为 e*2000*2000 

绰绰有余

 

因为下标从1开始计数

然后一开始fill的时候没注意看wa了几炮T^T

 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include <set>
#include 
#include using namespace std;const int maxn = 2010;
const int M = 1000000007;int dp[maxn][maxn];int main()
{//freopen("in.txt", "r", stdin);int n, k;scanf("%d%d", &n, &k);fill(dp[1] + 1, dp[1] + 2001, 1);for(int i = 2; i <= k; i++){for(int j = 1; j <= 2000; j++){for(int t = 1; j*t <= 2000; t++){dp[i][j*t] = (dp[i][j*t] + dp[i-1][j]) % M;}}}int ans = 0;for(int i = 1; i <= n; i++)ans = (ans + dp[k][i]) % M;printf("%d
", ans);return 0;
}

 

转载于:https://www.cnblogs.com/dishu/p/4295089.html

更多相关:

  • 关于点云的分割算是我想做的机械臂抓取中十分重要的俄一部分,所以首先学习如果使用点云库处理我用kinect获取的点云的数据,本例程也是我自己慢慢修改程序并结合官方API 的解说实现的,其中有很多细节如果直接更改源程序,可能会因为数据类型,或者头文件等各种原因编译不过,会导致我们比较难得找出其中的错误,首先我们看一下我自己设定的一个场景,...

  • /* 使用正态分布变换进行配准的实验 。其中room_scan1.pcd room_scan2.pcd这些点云包含同一房间360不同视角的扫描数据 */ #include #include #include #include

  • #include #include #include #include ...

  • #include #include #include #include #include #include...

  • #include #include #include #include int main (int argc,...

  • 题目:正则表达式匹配 请实现一个函数用来匹配包含'. '和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"和"ab*a"均不匹配。 示例 1:...

  • 题意:就是在n*m的格子中放“炮”(中国象棋中的棋子)问有多少种放法,使得没有任意的两个炮相互攻击 思路:我们很容易的得到一列或者一行中最多放下两个炮(我也只能得到这些了,满脑子状压,但数据范围有100),这篇博客些的很好(传送门),我们定义dp[i][j][k]代表前i行我们有j列式有2个棋子,有k列是一个棋子,那么我们空的列的个数...

  • 虽然也是一道dp的入门题,但就是想不到,或者说不会实现。dp还是要多做题。 链接:https://www.luogu.org/problemnew/show/P1164   我们可以设dp[i][j]表示以考虑完第i件,恰好消费j元的方案数。那么dp[i][j]=dp[i-1][j]+dp[i-1][j-a[i]],也就是讨论第i件点...

  • bzoj1260,懒得复制,戳我戳我 Solution: 这种题目我不会做qwq,太菜了区间打牌(dp) 用f[l][r]表示从l到r最少需要染几次色。状态转移方程: 1.(f[l][r]=min(f[l][i],f[i+1][r]) (l<=i

  • 题目背景 博弈正在机房颓一个叫做《模拟城市2.0》的游戏。 2048年,经过不懈努力,博弈终于被组织委以重任,成为D市市委书记!他勤学好问,励精图治,很快把D市建设成富强民主文明和谐的美好城市。为了进一步深化发展,他决定在海边建立一个经济开发区。 题目描述 已知开发区的建筑地块是一个n×nn imes nn×n的矩形,而开发...