基础动态规划
dp问题
剑决浮云气
事了拂衣去,深藏功与名
展开
-
动态规划之方格取数
题目描述设有N×N的方格图(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0。某人从图的左上角的AA点出发,可以向下行走,也可以向右走,直到到达右下角的BB点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。此人从(0, 0)点到(n,n)点共走两次,试找出2条这样的路径,使得取得的数之和为最大。输入输出格式输入格式:输入的第一行为一个整数N(表示N×N的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置上所放的数。一行单独的0表示输入结束原创 2021-08-10 21:08:53 · 312 阅读 · 0 评论 -
动态规划之摘花生
题目摘花生描述Hello Kitty想摘点花生送给她喜欢的米老鼠。她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生苗就能摘走该它上面所有的花生。Hello Kitty只能向东或向南走,不能向西或向北走。问Hello Kitty最多能够摘到多少颗花生。输入格式第一行是一个整数T,代表一共有多少组数据。1≤T≤100接下来是T组数据。每组数据的第一行是两个整数,分别代表花生苗的行数R和列数 C(1≤R原创 2021-08-09 20:44:20 · 214 阅读 · 0 评论 -
最长上升子序列
问题描述给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少。输入格式第一行包含整数N。第二行包含N个整数,表示完整序列。输出格式输出一个整数,表示最大长度。dp[i]表示以当前数字为结尾的最长上升子序列未优化的代码#include <iostream>#include <algorithm>using namespace std;const int N = 1010;int dp[N];int Arr[N];int main(int原创 2021-01-20 19:29:02 · 63 阅读 · 0 评论 -
数字三角形
问题描述给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。输入格式第一行包含整数n,表示数字三角形的层数。接下来n行,每行包含若干整数,其中第 i 行表示数字三角形第 i 层包含的整数。输出格式输出一个整数,表示最大的路径数字和。代码 记忆化搜索#include <iostream>#include <algorithm>using namespace原创 2021-01-20 19:26:43 · 171 阅读 · 0 评论 -
最长公共子序列
问题描述给定两个长度分别为N和M的字符串A和B,求既是A的子序列又是B的子序列的字符串长度最长是多少。输入格式第一行包含两个整数N和M。第二行包含一个长度为N的字符串,表示字符串A。第三行包含一个长度为M的字符串,表示字符串B。字符串均由小写字母构成。状态表示 dp[i][j]代表的是第一个序列的前i个字母,和第二个序列的前j个字母的公共子序列最大值那么集合就可以分成四种 i,j都不选 只选i不选j, 只选j不选i,ij都选代码#include <iostream>#inc原创 2021-01-20 19:24:10 · 150 阅读 · 0 评论 -
分组背包问题
问题描述:有 N 组物品和一个容量是 V 的背包。每组物品有若干个,同一组内的物品最多只能选一个。每件物品的体积是 vij,价值是 wij,其中 i 是组号,j 是组内编号。求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行有两个整数 N,V,用空格隔开,分别表示物品组数和背包容量。接下来有 N 组数据:每组数据第一行有一个整数 Si,表示第 i 个物品组的物品数量;每组数据接下来有 Si 行,每行有两个整数 vij,wij,用空格隔开,分别原创 2021-01-20 11:48:05 · 72 阅读 · 0 评论 -
二进制优化多重背包
问题描述有 N 种物品和一个容量是 V 的背包。第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。思路:将每种物品 进行打包。例如第一种物品有M个,我们用二进制的形式,对这M个分别进行打包,1,2,4,8…0-M总能原创 2021-01-20 11:41:46 · 75 阅读 · 0 评论 -
多重背包问题暴力
有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。#include <iostream>using namespace std;const int N = 1010;int n;//物品个数int Weight[N];//物品的重量 int Value[N];//物品的价值 int Amount[N];//每个物品有几个int BagSize; in原创 2021-01-19 21:59:53 · 162 阅读 · 1 评论 -
完全背包问题
完全背包描述:总承受重量为m的背包和n种物品,每个物品都有各自的重量Weight和价值Value,每种物品都有无限件可用,将哪些物品装入背包物品重量总数不超过包的总承受重量m 时,能够得到的最大价值是多少?思路:对dp[i][j]这个集合进行划分,对i这件物品,可以令k取0,1,2,3,…一直取到超出该背包大小.那么dp[i][j] = max(dp[ i-1 ] [ j ], dp[ i-1 ] [ j - Weight[ i ]] + Value[i],dp[ i - 1] [j - 2 *原创 2021-01-19 21:09:00 · 95 阅读 · 0 评论 -
0-1背包问题
问题描述:给定 n 件物品,物品的重量为 w[i],物品的价值为 c[i]。现挑选物品放入背包中,假定背包能承受的最大重量为 V,问应该如何选择装入背包中的物品,使得装入背包中物品的总价值最大?dp[i][j]代表了在前i件物品中 选取重量不超过j的最大价值,dp[i][j]这个集合 可以选择第i件物品 也可以不选择第i件物品①当不选择第i件物品时 那么dp[i][j]就是dp[i-1][j] 在前i-1件物品中取不超过j的最大价值②当选择第i件物品时,那么dp[i][j]就是dp[i][j]就是原创 2021-01-19 20:30:20 · 151 阅读 · 0 评论