线性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>af(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的更多相关文章

  1. 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] ...

  2. 中南大学2019年ACM寒假集训前期训练题集(基础题)

    先写一部分,持续到更新完. A: 寒衣调 Description 男从戎,女守家.一夜,狼烟四起,男战死沙场.从此一道黄泉,两地离别.最后,女终于在等待中老去逝去.逝去的最后是换尽一生等到的相逢和团圆 ...

  3. HZNU-ACM寒假集训Day10小结 树-树形DP

    树形DP 加分二叉树 洛谷P1040 注意中序遍历的特点:当根节点编号k时,编号小于k的都在其左子树上,编号大于k的都在右子树 转移方程 f[i,j]=max{f[i,k-1]*f[k+1,j]+d[ ...

  4. 【LOJ6074】【2017 山东一轮集训 Day6】子序列 DP

    题目描述 有一个由前 \(m\) 个小写字母组成的串 \(S\),有 \(q\) 个询问,每次给你 \(l,r\),问你 \(S_{l\ldots r}\) 有多少个非空子序列. \(m=9,n=\l ...

  5. 中南大学2019年ACM寒假集训前期训练题集(入门题)

    A: 漫无止境的八月 Description 又双叒叕开始漫无止境的八月了,阿虚突然问起长门在这些循环中团长哪几次扎起了马尾,他有多少次抓住了蝉等等问题,长门一共回复n个自然数,每个数均不超过1500 ...

  6. HZNU-ACM寒假集训Day8小结 最小生成树

    最小生成树(无向图) Kruskal 给所有边按从小到大排序 形成环则不选择(利用并查集) P1546 最短网络   https://www.luogu.com.cn/problem/P1546 #i ...

  7. HZNU-ACM寒假集训Day3小结 搜索

    简单搜索 1.DFS UVA 548 树 1.可以用数组方式实现二叉树,在申请结点时仍用“动态化静态”的思想,写newnode函数 2.给定二叉树的中序遍历和后序遍历,可以构造出这棵二叉树,方法是根据 ...

  8. HZNU-ACM寒假集训Day1小结 STL 并查集

    常用STL 1.优先队列 priority_queue 内部是用堆(heap)实现的 priority_queue<int> pq; 默认为一个“越小的整数优先级越低的优先队列” 对于一些 ...

  9. 2022寒假集训day6

    day6上午还是做四道题T1区域[上机练习]1.编程计算由"*"号围成的下列图形的面积.面积计算方法是统计*号所围成的闭合曲线中水平线和垂直线交点的数目.如下图所示,在 10*10 ...

随机推荐

  1. RNN、LSTM、Seq2Seq、Attention、Teacher forcing、Skip thought模型总结

    RNN RNN的发源: 单层的神经网络(只有一个细胞,f(wx+b),只有输入,没有输出和hidden state) 多个神经细胞(增加细胞个数和hidden state,hidden是f(wx+b) ...

  2. 初级入门 --- web GL绘制点

    " 万丈高楼平地起." 01基础知识 一.相关术语 图元 :WebGL 能够绘制的基本图形元素,包含三种:点.线段.三角形. 片元:可以理解为像素,像素着色阶段是在片元着色器中. ...

  3. NO16 第二关课后考试-aw-F-过滤已知的一级目录

    ·总结的经验:1.学会总结时学好运维的重要前提.2.通过案列或例子来总结一个技术点或者命令.3.画一张逻辑图,形象的卡通记忆这个知识技术点.4.通过管道过滤数据时,最好先输出结果,然后回退再使用管道看 ...

  4. Jmockit如何同时mock多个类的静态方法

    使用Jmockit来mock类的静态方法,网上有很多mock单个类静态方法的例子.有使用Expectations,还有使用MockUp的. 但是如果想在一个测试方法中mock多个类的静态方法,该怎么写 ...

  5. 2-10 就业课(2.0)-oozie:10、伪分布式环境转换为HA集群环境

    hadoop 的基础环境增强 HA模式 HA是为了保证我们的业务 系统 7 *24 的连续的高可用提出来的一种解决办法,现在hadoop当中的主节点,namenode以及resourceManager ...

  6. 016、MySQL取本年第一季度开始日期

    #取第1季度开始日期 SELECT date_add( dy, INTERVAL ( ) MONTH ) dy FROM ( ) dy ) x ; 效果如下: 不忘初心,如果您认为这篇文章有价值,认同 ...

  7. UVA 12510/CSU 1119 Collecting Coins DFS

    前年的省赛题,难点在于这个石头的推移不太好处理 后来还是看了阳神当年的省赛总结,发现这个石头这里,因为就四五个子,就暴力dfs处理即可.先把石头当做普通障碍,进行一遍全图的dfs或者bfs,找到可以找 ...

  8. python-处理json、处理时间

    1.处理json:import json #json串就是字符串. d = { 'car1':{'color':'red','price':100,'count':50}, 'car2':{'colo ...

  9. redis.conf文件配置

    最重要三个配置 1. bind 127.0.0.1 需要注释掉这一行,使别的主机可以访问 2. daemonize no 需要改为yes,使其后台运行 3. requirepass foobared ...

  10. 全选checkbox只能执行一次的问题

    现象:第一次运行,点select all那个checkbox,可以全选,再点一次,也可以全部取消.但是,之后不管怎样点击,都没有用了…… <input type="checkbox&q ...