动态规划 List
例题
#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的更多相关文章
- 增强学习(三)----- MDP的动态规划解法
上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...
- 简单动态规划-LeetCode198
题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...
- 动态规划 Dynamic Programming
March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...
- 动态规划之最长公共子序列(LCS)
转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
- C#动态规划查找两个字符串最大子串
//动态规划查找两个字符串最大子串 public static string lcs(string word1, string word2) { ...
- C#递归、动态规划计算斐波那契数列
//递归 public static long recurFib(int num) { if (num < 2) ...
- 动态规划求最长公共子序列(Longest Common Subsequence, LCS)
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- 【BZOJ1700】[Usaco2007 Jan]Problem Solving 解题 动态规划
[BZOJ1700][Usaco2007 Jan]Problem Solving 解题 Description 过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目. 精确地 ...
- POJ 1163 The Triangle(简单动态规划)
http://poj.org/problem?id=1163 The Triangle Time Limit: 1000MS Memory Limit: 10000K Total Submissi ...
- hdu FatMouse's Speed 动态规划DP
动态规划的解决方法是找到动态转移方程. 题目地址:http://acm.hdu.edu.cn/game/entry/problem/show.php?chapterid=3§ionid ...
随机推荐
- 加密算法:DES、AES等
指标:运算速度.安全性.资源消耗 对称加密算法(加解密密钥相同): 非对称算法(加密密钥和解密密钥不同): 散列算法比较: 对称与非对称算法比较: 算法选择(从性能和安全性综合) 对称加密: AES( ...
- github廖雪峰git
gitHub地址: https://github.com/DickyQie/Tool-use/tree/git-learning-document
- js如何获取到select的option值???
1.获得选项option的值 var obj = document.getElementByIdx_x(”testSelect”); //定位id var index = obj.selectedIn ...
- python学习shutil模块的文件压缩和解压用法
shutil模块可以创建压缩包并返回文件路径,例如 zip,tar,下面详细其用法 base_name 压缩包的文件名,也可以是压缩包的路径,只是文件名时,则保存至当前目录,否则保存指定路径 data ...
- Ftp客户端(上传文件)
#coding=utf-8 import os import socket import hashlib import json # client = socket.socket() #申明socke ...
- 【推荐系统】知乎live入门3.召回
参考链接 [推荐系统]知乎live入门 目录 1. 概述 2. 画像过滤 3. 协同过滤 4. 内容过滤 5. 模型过滤 6. 其他过滤 7. 总结 ========================= ...
- vue访问外部接口设置代理,解决跨域(vue-cli3.0)
vue-cli3.0搭建的项目,平时访问内部接口配置了拦截器,今天需要调用天气预报的外部接口,发现跨域问题,通过配置代理解决. 1.在vue.config.js中配置代理 module.exports ...
- struts2导入多个xml引入报错<include>
struts.xml <?xml version="1.0" encoding="UTF-8"?> <!-- 指定Struts 2配置文件的D ...
- TensorFlow学习笔记1:graph、session和op
graph即tf.Graph(),session即tf.Session(),很多人经常将两者混淆,其实二者完全不是同一个东西. graph定义了计算方式,是一些加减乘除等运算的组合,类似于一个函数.它 ...
- iBatis.Net 语句 获取Identity ID
<insert id="Table_Operate_Id" parameterClass="Entity" resultClass="Syste ...