dp
Lqingyyyy
这个作者很懒,什么都没留下…
展开
-
牛客小白月赛48 F
dp就完事了原创 2022-10-19 14:54:24 · 94 阅读 · 0 评论 -
Codeforces Round #738 (Div. 2) E
首先可以想到 题目如果通过正面来求的话 那么所需要求的种类很复杂 所以很容易想到容斥的思想 我们就可以想到 将所有组建情况再减去 gcd不是 1 的情况即可1.组建所有情况 就可以考虑 dp 前 i个数 组成 m 的种类有多少 很明显 是个背包 但是 复杂度为 nm * (ri - li)所以超时 考虑优化 因为 ri ~ li是连续的 所以可以使用前缀和优化至 2nm2.gcd不是1的情况 那么就可以变成 gcd 为2 为 3.。。。。为 m的情况 考虑2的时候 我们可以把所有2的倍数往上放 3的时候原创 2021-08-17 14:46:49 · 147 阅读 · 0 评论 -
牛客多校2 G League of Legends
#include<iostream>#include<cstring>#include<algorithm>#include<map>#include<vector>using namespace std;const int N = 5e3 + 10;int n,k;struct node{ int l,r; bool operator < (const node &p)const{ .原创 2021-07-29 22:39:08 · 118 阅读 · 0 评论 -
E - Digit Products 实在是瞎搞
首先我是想把题目分成好几部分来做 首先是第一部分 列如88897 我们找到它的最高位 然后先把10000以下的算出来 如何去算呢 分成两部分 一部分是 没有0的 一部分是有0的 有0这一部分用dp + map就可以了因为 最多组成的乘积有 9^9 / 9! 为1000多一点 所以开map是完全没问题的 没有0的部分用容斥的思想 就是全部数减掉 每位都>=1 的情况因为我们这个是只能在整数部分 就是后面每位都可以取到9的情况 我们不妨从前往后 把每一位的小一位取出来 去求 数量 最后统计一下即可#原创 2021-07-05 23:10:39 · 226 阅读 · 0 评论 -
51nod1201 dp整数划分
数据是5e4 考虑最基本的dp 前 i 位由 j个不同的数组成有多少种 首先可以用二分先 找出那个最多的不同的数 是 350 然后我们考虑状态转移 最简单的就是 每一次新增一个 1 那么我们如何去新增一个1而使1不重复呢 我们可以把前面所有的数都先加一个 1 然后再加一个1 那么就是 dp[i - j][j - 1] 我们可以发现 前面的数全都加一个一 也是不会重复得所以 dp[i][j] = dp[i -j][j - 1] + dp[i - j][j ];#include<iostream>.原创 2021-06-16 12:47:44 · 118 阅读 · 0 评论 -
P1841 [JSOI2007]重要的城市
题意是 x 到 y的最短路 如果 他们的路中去掉 一个点 使得 最短路 变大 那么 这个点就是一个重要点 求出所有重要点 。这个题很简单 只要floyd 跑 经过这个点是否是所有最短路的和 即可#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int N = 210;int flag[N];int dist[N][N],num[N][N];int原创 2021-05-28 12:59:08 · 108 阅读 · 0 评论 -
KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200)E
首先考虑n^2的做法那就是for(int i = 1; i <= 3; i++){for(int j = 1; j <= 3 * n; j++){for(int k = 1; k <= n; k++){dp[i][j + k] += dp[i - 1][j];我们从中可以看出 当 j = 1的时候他对所有 j + 1 ~ j + n 那么 j = 2 就对 j + 2 ~ j + n + 1是有贡献的所以我们只需求一个前缀和 即可#include<iostream&原创 2021-05-10 12:08:57 · 354 阅读 · 0 评论 -
acwing135. 最大子序和 单调队列优化
首先我们先知道他要找连续的值 我们可以使用前缀和相减那么若一个连续的值最大 那么我们只需要找到 i ~ i + m - 1这其中最大的一个前缀和的点 即可所以我们使用单调队列优化 来判断这个连续区间中的最值#include<iostream>#include<queue>using namespace std;const int N = 3e5 + 10;typedef long long ll;ll a[N],s[N],ne[N];int main(){原创 2021-04-22 15:37:44 · 94 阅读 · 0 评论