HZNU-ACM寒假集训Day6小结 线性DP
线性DP
考虑一组硬币面值 1,5,11 给定W,求凑出W的最少硬币个数
我们记凑出n需要用到的最少硬币数量为f(n) 我们注意到了一个很棒的性质 : f(n)只与f(n-1) f(n-5) f(n-11) 有关。
更确切的说f(n)=min(f(n-1),f(n-5),f(n-11)}+1
int f[], cost;
int main() {
int n;
scanf("%d", &n);
f[] = ;
for (int i = ; i <= n; i++) {
cost = INF;
if (i - >= ) cost = min(cost, f[i - ] + );
if (i - >= ) cost = min(cost, f[i - ] + );
if (i - >= ) cost = min(cost, f[i - ] + );
f[i] = cost;
printf("f[%d]=%d\n", i, f[i]);
}
}
这个做法的原理是:
--f(n)只与f(n-1),f(n-5),f(n-11)相关
--我们只关心f(w)的值,不关心怎么取到W的
这就是DP,将一个问题拆成几个子问题,分别求解这些子问题,即可推断大问题的解
大问题的最优解可以由小问题的最优解推出,这个性质叫“最优子结构性质”。
用DP的情况
--能将大问题拆成小问题
--无后效性
--最优子结构性质
DP核心思想:尽量缩小可能解空间
首先把面对的局面表示为x,称为设计状态
对于状态x,记我们要求出的答案为f(x),目标是求出f(T) 找出f(x)与哪些局面有关,写出一个式子(称为状态转移方程)通过f(p)推出f(x)
最长上升子序列 (LIS)
设计状态:记f(x)为以ax结尾的LIS长度,那么答案就是max{f(x)}
状态转移:考虑比x小的每一个p,如果ax>ap f(x)可取f(p)+1
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
//LIS
int n;
int a[], f[]; int main() {
scanf("%d", &n);
for (int i = ; i < n; i++) scanf("%d", &a[i]);
int Max;
for (int i = ; i < n; i++) {
f[i] = ;
for (int j = ; j < i; j++) {
if (a[i] > a[j]) f[i] = max(f[i], f[j] + );
}
Max = max(Max, f[i]);
}
printf("%d", Max);
return ;
}
LCS
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
//LCS
int dp[][];
string x, y;
int l1, l2;
int main() {
cin >> x >> y;
int l1 = x.length();
int l2 = y.length();
for (int i = ; i <=l1; i++) {
for (int j = ; j <=l2; j++) {
if (x[i-] == y[j-]) dp[i][j] = dp[i - ][j - ] + ;
else dp[i][j] = max(dp[i - ][j], dp[i][j - ]);
}
}
cout << dp[l1][l2];
return ;
}
洛谷P1020 导弹拦截
1.最长不上升序列长度
2.最长上升序列长度
code:
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<queue>
#include<deque>
#include<set>
#include<map>
#include<cmath>
#include<cstring>
#include<stack>
#include<cctype>
const double PI = acos(-1.0);
#define eps 1e-6
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std; const int maxn = ; int a[maxn], d1[maxn], d2[maxn];
int n; int main() {
while (~scanf("%d", &a[n++]));
int len1 = , len2 = ;
d1[] = a[], d2[] = a[];
for (int i = ; i < n-; i++) {
if (d1[len1] >= a[i]) d1[++len1] = a[i];
else {
d1[upper_bound(d1, d1 + len1+, a[i], greater<int>()) - d1] = a[i];
}
if (d2[len2] < a[i]) d2[++len2] = a[i];
else {
d2[lower_bound(d2, d2 + len2+, a[i]) - d2] = a[i];
}
}
//for (int i = 0; i < len1; i++) printf("%d ", d1[i]);
//for (int i = 0; i < len2; i++) printf("%d ", d2[i]);
printf("%d\n%d", len1 + , len2 + );
return ;
}
HZNU-ACM寒假集训Day6小结 线性DP的更多相关文章
- HZNU-ACM寒假集训Day7小结 背包DP
背包问题 01背包 状态:f(i,j) 表示只能装前i个物品的情况下,容量为j的背包所能达到的最大总价值 状态转移方程: f(i,j)=max(f(i-1,j),f(i-1,j-w[i])+v[i] ...
- 中南大学2019年ACM寒假集训前期训练题集(基础题)
先写一部分,持续到更新完. A: 寒衣调 Description 男从戎,女守家.一夜,狼烟四起,男战死沙场.从此一道黄泉,两地离别.最后,女终于在等待中老去逝去.逝去的最后是换尽一生等到的相逢和团圆 ...
- HZNU-ACM寒假集训Day10小结 树-树形DP
树形DP 加分二叉树 洛谷P1040 注意中序遍历的特点:当根节点编号k时,编号小于k的都在其左子树上,编号大于k的都在右子树 转移方程 f[i,j]=max{f[i,k-1]*f[k+1,j]+d[ ...
- 【LOJ6074】【2017 山东一轮集训 Day6】子序列 DP
题目描述 有一个由前 \(m\) 个小写字母组成的串 \(S\),有 \(q\) 个询问,每次给你 \(l,r\),问你 \(S_{l\ldots r}\) 有多少个非空子序列. \(m=9,n=\l ...
- 中南大学2019年ACM寒假集训前期训练题集(入门题)
A: 漫无止境的八月 Description 又双叒叕开始漫无止境的八月了,阿虚突然问起长门在这些循环中团长哪几次扎起了马尾,他有多少次抓住了蝉等等问题,长门一共回复n个自然数,每个数均不超过1500 ...
- HZNU-ACM寒假集训Day8小结 最小生成树
最小生成树(无向图) Kruskal 给所有边按从小到大排序 形成环则不选择(利用并查集) P1546 最短网络 https://www.luogu.com.cn/problem/P1546 #i ...
- HZNU-ACM寒假集训Day3小结 搜索
简单搜索 1.DFS UVA 548 树 1.可以用数组方式实现二叉树,在申请结点时仍用“动态化静态”的思想,写newnode函数 2.给定二叉树的中序遍历和后序遍历,可以构造出这棵二叉树,方法是根据 ...
- HZNU-ACM寒假集训Day1小结 STL 并查集
常用STL 1.优先队列 priority_queue 内部是用堆(heap)实现的 priority_queue<int> pq; 默认为一个“越小的整数优先级越低的优先队列” 对于一些 ...
- 2022寒假集训day6
day6上午还是做四道题T1区域[上机练习]1.编程计算由"*"号围成的下列图形的面积.面积计算方法是统计*号所围成的闭合曲线中水平线和垂直线交点的数目.如下图所示,在 10*10 ...
随机推荐
- python符号//、%和/运算
a = 9 print('这是%运算的结果'+str(a%2)) print('这是//运算的结果'+str(a//2)) print('这是/运算的结果'+str(a/2))运算结果为 这是%运算的 ...
- 动态指定日志路径(logback)
实现日志上下文监听,添加路径变量 package com.x.x.x.listener; import ch.qos.logback.classic.Level; import ch.qos.logb ...
- 微软重制Windows 1.0系统:祖师爷出山了
Windows官方推特在7月1日发布了一条很有趣的动态,“向大家介绍全新的Windows 1.0,带MS-DOS.时钟等”.配发的视频回顾了从Windows 1.0/3.1到Windows 10期间, ...
- iOS dismissViewControllerAnimated:completion:使用方法
我们都知道dismissViewControllerAnimated:completion:方法是针对被present出来的控制器的,一般我们这样使用:在一个控制器中present另外一个控制器A,然 ...
- 挖洞经验 | 绕过WAF限制利用php:方法实现OOB-XXE漏洞利用
几个星期以前,作者在某个OOB-XXE漏洞测试中遇到过这样一种场景:目标应用后端系统WAF防火墙阻挡了包含DNS解析在内的所有出站请求(Outgoing Request),但最终,通过利用php:// ...
- 008、MySQL日期时间格式化输出
#日期格式化 SELECT date_format( '2008/08/08 22:23:01', '%Y-%m-%d-%H--%i--%s' ); 不忘初心,如果您认为这篇文章有价值,认同作者的付出 ...
- hibernate 中 query.list()的优化
2018年3月15日 今天做项目遇到一个需求,问题是在调用query.list()的时候,因为数据也多大概700条左右,查询一次需要30s+,这简直是不能忍,于是开始考虑怎么优化. 1.因为是单表查 ...
- canon 打印机 连接不上 netgear 路由器
解决方法很简单,只要把信道设置到 10以内即可.
- Oracle 中启用 scott 用户 的方法
解锁scott: SQL> alter user scott account unlock 修改密码: SQL> alter user scott identified by tiger ...
- ArcGIS二次开发的几种方式
1.ArcEngine开发 二次开发的常用方式,开发提供接口齐全,功能强大,比较成熟.但是,开发的软件使用需要指定版本的运行环境才能运行. 2.Addin开发 二次开发与ArcMap嵌入,开发方便,可 ...