例题

#A 传纸条(Accepted)
    #B 乘积最大 (Unaccepted)
    #C 石子合并 (Accepted)
    #D 加分二叉树 (Unaccepted)
    #E 没有上司的舞会(Unaccepted)
    #F 选课 (Accepted)
    #G 警卫安排 (Unaccepted)
    #H 通向自由的钥匙 (Unaccepted)

#I 导弹拦截 (Unaccepted)
    #J [HAOI2010]最长公共子序列 (Unaccepted)
    #K 排列LCS问题 (Unaccepted)
    #L 尼克的任务(Accepted)
    #M 多米诺骨牌(Accepted)
    #N 最大子树和(Unaccepted)
    #O “访问”美术馆(Unaccepted)
    #P 石子合并(Accepted)
    #Q 关路灯(Unaccepted)
    #R M国王(Unaccepted)
    #S 愤怒的小鸟(Unaccepted)


1. LCS 最长公共子序列

/* LCS
* Au: GG
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1005;
int n, m, d[N][N], A[N], B[N]; int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) scanf("%d", &A[i]);
for (int i = 1; i <= m; i++) scanf("%d", &B[i]); for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
d[i][j] = max(d[i - 1][j], d[i][j - 1]);
if (A[i] == B[j])
d[i][j] = max(d[i][j], d[i - 1][j - 1] + 1);
}
} printf("%d\n", d[n][m]);
return 0;
}

2. LIS 最长上升自序列

/**
* LIS
* Au: GG
**/ #include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std; const int N = 1000000 + 3;
int n, a[N], d[N];
int ans; int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
} for (int i = 1; i <= n; i++) {
d[i] = 1;
for (int j = 1; j < i; j++) {
if (a[i] > a[j] && d[j] + 1 > d[i])
d[i] = d[j] + 1;
}
ans = max(ans, d[i]);
} printf("%d\n", ans);
return 0;
}

3. 01 背包

// 01 Knapsack
// Au: GG #include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std; int n, v, w[33], f[33][20003]; int main() {
scanf("%d%d", &v, &n);
for (int i = 1; i <= n; i++) scanf("%d", &w[i]); for (int i = 1; i <= n; i++) {
for (int j = 1; j <= v; j++) {
if (j - w[i] < 0) f[i][j] = f[i - 1][j];
else f[i][j] = max(f[i - 1][j - w[i]] + w[i], f[i - 1][j]);
}
} printf("%d", v - f[n][v]); return 0;
}

4. 完全背包

/**
* Luogu P1616 疯狂的采药
* Au: GG
**/ #include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n, m, d[100000+4], w[100000+3], v[100000+3]; int main() {
scanf("%d%d", &m, &n);
for (int i = 1; i <= n; i++) scanf("%d%d", &v[i], &w[i]); for (int i = 1; i <= n; i++) {
for (int j = v[i]; j <= m; j++) {
d[j] = max(d[j], d[j - v[i]] + w[i]);
}
} printf("%d\n", d[m]);
return 0;
}

5. 多维背包

/**
* Luogu P1855 榨取kkksc03
* Au: GG
**/ #include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std; const int N = 100 + 3, M = 200 + 3;
int n, m, t, time[N], w[N], d[N][M][M]; int main() {
scanf("%d%d%d", &n, &m, &t);
for (int i = 1; i <= n; i++) scanf("%d%d", &time[i], &w[i]); for (int i = 1; i <= n; i++) {
for (int j = 0; j <= m; j++) {
for (int k = 0; k <= t; k++) {
d[i][j][k] = d[i - 1][j][k];
if (j - time[i] >= 0 && k - w[i] >= 0 && d[i - 1][j - time[i]][k - w[i]] + 1 > d[i][j][k])
d[i][j][k] = d[i - 1][j - time[i]][k - w[i]] + 1;
}
}
} printf("%d\n", d[n][m][t]);
return 0;
}

6. 树形 DP (Unaccepted)

7. 区间 DP

/* Luogu P1880 石子合并
* Au: GG
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100 + 5;
const int inf = 2147483647;
int n, d[2 * N][2 * N], e[2 * N][2 * N], a[N], sum[2 * N];
int ans1 = inf, ans2 = - inf; int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]); for (int i = 1; i <= 2 * n; i++) sum[i] = sum[i - 1] + a[i > n ? i % n : i]; for (int i = 1; i <= 2 * n; i++) d[i][i] = 0;
for (int len = 2; len <= n; len++) {
for (int i = 1; i + len - 1 <= 2 * n; i++) {
int j = i + len - 1;
d[i][j] = inf;
for (int k = i; k < j; k++) {
d[i][j] = min(d[i][j], d[i][k] + d[k + 1][j] + sum[j] - sum[i - 1]);
}
}
}
for (int i = 1; i <= n; i++) ans1 = min(ans1, d[i][i + n - 1]); for (int i = 1; i <= 2 * n; i++) e[i][i] = 0;
for (int len = 2; len <= n; len++) {
for (int i = 1; i + len - 1 < 2 * n; i++) {
int j = i + len - 1;
e[i][j] = - inf;
for (int k = i; k < j; k++) {
e[i][j] = max(e[i][j], e[i][k] + e[k + 1][j] + sum[j] - sum[i - 1]);
}
}
} for (int i = 1; i <= n; i++) ans2 = max(ans2, e[i][i + n - 1]); printf("%d\n%d\n", ans1, ans2); return 0;
}

8. 状态压缩 DP (Unaccepted)

动态规划 List的更多相关文章

  1. 增强学习(三)----- MDP的动态规划解法

    上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...

  2. 简单动态规划-LeetCode198

    题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...

  3. 动态规划 Dynamic Programming

    March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...

  4. 动态规划之最长公共子序列(LCS)

    转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...

  5. C#动态规划查找两个字符串最大子串

     //动态规划查找两个字符串最大子串         public static string lcs(string word1, string word2)         {            ...

  6. C#递归、动态规划计算斐波那契数列

    //递归         public static long recurFib(int num)         {             if (num < 2)              ...

  7. 动态规划求最长公共子序列(Longest Common Subsequence, LCS)

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  8. 【BZOJ1700】[Usaco2007 Jan]Problem Solving 解题 动态规划

    [BZOJ1700][Usaco2007 Jan]Problem Solving 解题 Description 过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目. 精确地 ...

  9. POJ 1163 The Triangle(简单动态规划)

    http://poj.org/problem?id=1163 The Triangle Time Limit: 1000MS   Memory Limit: 10000K Total Submissi ...

  10. hdu FatMouse's Speed 动态规划DP

    动态规划的解决方法是找到动态转移方程. 题目地址:http://acm.hdu.edu.cn/game/entry/problem/show.php?chapterid=3&sectionid ...

随机推荐

  1. GUI_FlowLayout

    void setBounds(x, y, width, height) 设置窗体坐标,窗体大小 import java.awt.Frame; public class IntegerDemo { pu ...

  2. oracle DBID,SID,DB_NAME,DB_DOMAIN,INSTANCE_NAME,DB_UNIQUE_NAME, SERVICE_NAMES 及监听参数的说明

    DBID,SID,DB_NAME,DB_DOMAIN,INSTANCE_NAME,DB_UNIQUE_NAME, SERVICE_NAMES 及监听参数的说明 DB 相关的: DBID, SIDPFI ...

  3. Krustal重构树

    zz:https://blog.csdn.net/ouqingliang/article/details/81206050 Kruskal重构树基于Kruskal算法.在执行算法过程中,Kruskal ...

  4. GARENA面试

    约了2019年10月16日下午2点现场面 岗位:数据开发 下午2点准时到了公司,公司环境棒棒哒,hr小姐姐也是贴心,整个面试的过程真的棒棒哒. 在我所有的面试经历中,这个是体验感最棒的,其次是上中的面 ...

  5. 多线程02-Join

        ; i < ; i++)             {                 Console.WriteLine(i);             }             Co ...

  6. [Python3] 013 集合:你不能两次进入同一个集合

    目录 0. 集合的独白 1. 集合的创建 2. 集合的特性 (1) 概述 (2) 少废话,上例子 3. 集合的遍历 4. 集合内涵 5. 集合的内置方法 6. 可供集合使用的一些方法/函数 (1) 又 ...

  7. RD Client、TeamViewer连接主机

    一.使用RD Client连接远程桌面 1.设置本地主机 2.查看电脑ip 3.手机安装RD Client 应用商店下载 Microsoft Remote Desktop PC name填入查询到的I ...

  8. Django重点之url别名

    django重点之url别名[参数名必须是name,格式是name="XXX] 不论后台路径如何进行修改路径,前台访问的路径不变,永远是alias, 这样方便开发 前台根据 {{ url & ...

  9. R语言基础篇——数据读写

    1.键盘输入数据(适合小数据集) #创建一个指定模式但不含数据的变量 mydata<-data.frame(age=numeric(0),gender=character(0),weight=n ...

  10. 采用pacemaker+corosync实现postgresql双机热备、高可用方案

    环境说明 参照上章已完成postgresql流复制配置,并关闭postgres服务. su - postgres pg_ctl -D /data/postgresql/data/ stop -m fa ...