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 ...
随机推荐
- docker-compose 修改zabbix images 添加微信报警插件 时间同步 中文乱码 添加grafana美化zabbix
我们先来看一下我们要修改得 zabbix.yaml github https://github.com/bboysoulcn/awesome-dockercompose ve ...
- PHP7 源码整体框架
一.PHP7语言执行原理 常用的高级语言有很多种,根据运行的方式不同,大体分为两种:编译型语言和解释型语言. 编译是指在应用源程序执行之前,就将程序源代码“翻译”成汇编语言,然后进一步根据软硬件环境编 ...
- 开发工具类(eclipse、安卓SDK) 镜像站
1.eclipse 中国科技大学:http://mirrors.ustc.edu.cn/eclipse/ 中国科学院:http://mirrors.opencas.cn/eclipse/ 东北大学:h ...
- Redis——进阶
redis的持久化 redis提供两种备份方式,一种是RDB 一种是AOFRDB默认开启.关闭注释掉所有的save,存储的是redis 具体的值,会压缩存储.AOF配置文件中appendonly ye ...
- python 文本文件操作
文件操作三步走:打开.读写.关闭. open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, close ...
- VS2019 添加控制器 主机运行转换时出现问题
问题: 解决方案: 更换低版本VS,亲测VS2017可行(其它未实测) VS2019目前没找到解决方案,VS版本问题 原文链接
- SpringBoot-数据库连接信息配置
SpringBoot-数据库连接信息配置 SpringBoot-数据库连接信息配置 在SpringBoot中提供了默认的数据库连接器-追光者HikariCP,我们只需要添加jdbc的启动器就会自动 ...
- 十六、React 渲染数据注意事项、以及react-router4.x中使用js跳转路由(登录成功自动跳转首页)
一.React加载数据流程回顾 先看上一节的产品详情代码:https://blog.csdn.net/u010132177/article/details/103184176 [Pcontent.js ...
- NO2 pwd-touch-vim-vi-echo-重定向等命令
·查看网卡配置:cat/etc/sysconfig/network-scripts/ifcfg-eth0·改onboot=no:sed -i's#noboot=yes#g' /etc/sysconfi ...
- 电脑必须用U盘引导盘才能进系统解决办法
昨天为了装Ubuntu双系统把系统给装崩了,结果重装win7系统之后出现了以下问题,百度的结果有些杂乱,解决过程自己做一下记录. 问题一:安装程序结束后,出现“Windows安装程序无法将Window ...