DP
牛郎恋刘娘,刘娘念牛郎
裂开来
展开
-
P1439 【模板】最长公共子序列
朴素版 o(n^2) for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { dp[i][j]=max(dp[i-1][j],dp[i][j-1]); if(a1[i]==a2[j]) dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1); //因为更新,所以++; } 此题n<=1e5 有nlog做法 因为两个序列都是1~n1 n的全排列,那么两个原创 2022-05-13 11:51:55 · 117 阅读 · 0 评论 -
P2014 [CTSC1997] 选课(树形dp)
题目链接 1 有前驱 2 有权值 可以联想到 是个森林结构 0代表空 如果把0看成根节点的话 就成了一个树 我们可以增加一个课容量 然后把0加入选课 就避免了森林结构 用前向星存图 把每个节点的子节点存起来 从0节点开始访问 dp[u][j] u->代表根节点 j->代表以u为起点选j个最大分数 然后进行动态规划 for(int i=head[u];i;i=e[i].next)//访问每一个叶子结点 for(int j=m,v=e[i].to;j>0;j--) //规划选课容量原创 2022-03-18 23:07:30 · 494 阅读 · 3 评论 -
加分二叉树(树形dp)
咱就是说 i枚举左节点 j枚举右节点 k枚举根节点 f是区间最大 答案就是f[1][n] rot [i][j] 存l r 节点的根节点是谁 也可以说是父亲节点 #include<bits/stdc++.h> #include<iostream> #include<cstring> #include<queue> #define inf 0x3f3f3f3f using namespace std; typedef long long ll; typedef .原创 2021-11-03 19:32:13 · 128 阅读 · 0 评论 -
数字游戏(区间DP)
P1043 [NOIP2003 普及组] 数字游戏 f[][][] 第一维第二维表示 第i个到第j个数 第三维表示 i到j 分成几段 f表示最大值或者最小值 四层循环 第一层i 第二层j 第三层分多少段 第四层中间值 #include<bits/stdc++.h> using namespace std; typedef long long ll; ll f[102][102][102]; ll f1[102][102][102]; ll a[10000],b[10000]; int main原创 2021-11-01 19:21:10 · 1826 阅读 · 0 评论