动态规划
jiaxiang_en
这个作者很懒,什么都没留下…
展开
-
最大序列和
数组中整数有正有负求一连续子段,使得和最大化例如:2,4,-7,5,2,-1,2,-4,3最大连续段:5,2,-1,2其最大和为8#include<iostream>using namespace std;int n;int a[100]= {2,4,-7,5,2,-1,2,-4,3};int dp[100];int main(){ int maxn=-100; dp[...原创 2018-03-29 22:52:57 · 154 阅读 · 0 评论 -
台阶问题
题目描述有N级的台阶,你一开始在底部,每次可以向上迈最多K级台阶(最少1级),问到达第N级台阶有多少种不同方式。输入输出格式输入格式:输入文件的仅包含两个正整数N,K。输出格式:输入文件stair.out仅包括1个正整数,为不同方式数,由于答案可能很大,你需要输出mod 100003后的结果。输入输出样例输入样例#1: 复制5 2输出样例#1: 复制8说明对于20%的数据,有N ≤ 10, K ≤...原创 2018-04-21 15:55:45 · 186 阅读 · 0 评论 -
最大连续子序列和
给定序列,求连续的子序列要求和最大,求最大的和为多少dp[i]表示以a[i]作为末尾的连续序列的最大和(a[i]必须是末尾被选的数啊啊),dp数组中所有的数据的最大值就是所求因为a[i]一定是所选序列的末尾,所以分为两种情况:a[i]开始,a[i]结束某数开始,到a[i]结束(最大和是dp[i-1] + a[i])所以递推方程为dp[i] = max(a[i], dp[i-1]+a[i])#inc...转载 2018-03-30 15:21:12 · 117 阅读 · 0 评论 -
拦截导弹
描述某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,并观测到导弹依次飞来的高度,请计算这套系统最多能拦截多少导弹。拦截来袭导弹时,必须按来袭导弹袭击的时间顺序,不允许先拦截后面的导弹,再拦截前面的导弹。输入输入有两行,第一行,输入雷达捕捉到的敌国导弹的...原创 2018-04-08 22:28:12 · 171 阅读 · 0 评论 -
导弹防御
最长上升子序列假定dp [k]表示以x[k]做为“终点”的最长上升子序列的长度,那么:dp [1] = 1dp [k] = max { dp [i] :1<i < k 且 x[i] < x[k]且 k≠1 } + 1123456789101112131415//len表示字符串长度,x[]表示字符串数组,dp[i]表示从1到i位置最长上升子序列长度 int dp(int le...转载 2018-04-08 22:28:26 · 178 阅读 · 0 评论 -
包子凑数
小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包子。每种蒸笼都有非常多笼,可以认为是无限笼。每当有顾客想买X个包子,卖包子的大叔就会迅速选出若干笼包子来,使得这若干笼中恰好一共有X个包子。比如一共有3种蒸笼,分别能放3、4和5个包子。当顾客想买11个包子时,大叔就会选2笼3个的再加1笼5个的(也可能选出1笼3个的再加2笼4个的)。当然有时包子大叔无...原创 2018-04-08 22:28:41 · 556 阅读 · 0 评论 -
背包问题
多阶段动态规划问题:有一类动态规划可解的问题,它可以描述成若干个有序的阶段,且每个阶段的状态有关,一般把这类问题称为多阶段动态规划问题01背包问题有n件物品,每件物品的重量为w[i],价值为c[i]。现有一个重量为V的背包,问如何选取物品放入背包,使得背包内物品的总价值最大。其中每种物品只有1件dp[i][j]表示前i件物品恰好装入容量为j的背包所能获得的最大价值不放第i件物品,则dp[i][j]...转载 2018-03-30 16:32:53 · 158 阅读 · 0 评论 -
最长回文子串
给出一个字符串s,求s的最长回文字串的长度dp[i][j]表示s[i]到s[j]所表示的字串是否是回文字串。只有0和1递推方程:当s[i] == s[j] : dp[i][j] = dp[i+1][j-1]当s[i] != s[j] : dp[i][j] =0边界:dp[i][j] = 1, dp[i][i+1] = (s[i] == s[i+1]) ? 1 : 0因为i、j如果从小到大的顺序来枚...转载 2018-03-30 16:08:03 · 95 阅读 · 0 评论 -
最长公共子序列(LCS)
给定两个字符串或者数字序列A和B,求一个字符串,使得这个字符串是A和B的最长公共部分(子序列可以不连续)dp[i][j]表示A的第i位之前和B的第i位之前的这两个序列的LCS最长公共子序列的长度(下标从1开始)那么dp[lena][lenb]即为所求递推方程:当a[i] == b[j] : dp[i][j] = dp[i-1][j-1] + 1当a[i] != b[j] : dp[i][j] = ...原创 2018-03-30 15:47:24 · 97 阅读 · 0 评论 -
最长不下降子序列(LIS)
求一个序列的最长的子序列(可以不连续),使得这个子序列是不下降的dp[i]表示必须以a[i]结尾的最长不下降子序列的长度dp[i] = max{1, dp[j] + 1}; // j从1 ~ i-1 且必须满足a[j] <= a[i]int ans = 0;for(int i = 0; i < n; i++) { for(int j = 1; j < i; j++) { ...转载 2018-03-30 15:36:38 · 174 阅读 · 0 评论 -
动态规划
将一个复杂的问题分解成若干个子问题,通过综合子问题的最优解来得到原问题的最优解动态规划会将每个求解过的子问题的解记录下来,这样下一次碰到同样的子问题时,就可以直接使用之前记录的结果,而不是重复计算可以用递归或者递推的写法实现,递归的写法又叫记忆化搜索重叠子问题:如果一个问题可以被分解成若干个子问题,且这些子问题会重复出现,就称这个问题拥有重叠子问题。 一个问题必须拥有重叠子问题,才能用动态规划去解...转载 2018-03-30 11:32:45 · 209 阅读 · 0 评论 -
数的划分
这道题我们可以用dp:f[i][x] 表示 i 分成 x 个非空的数的方案数。显然 i<x 时 f[i][x]=0 , i=x 时 f[i][x]=1;其余的状态,我们分情况讨论:①有1的 ②没有1的第一种情况,方案数为 f[i-1][x-1]第二种情况,方案数为 f[i-x][x] (此时 i 必须大于 x)所以,状态转移方程为: f[i][x]=f[i-1][x-1]+f[i-x][x]...转载 2018-04-21 16:41:24 · 327 阅读 · 0 评论