动态规划
文章平均质量分 64
xutian_curry
这个作者很懒,什么都没留下…
展开
-
动态规划入门题之The Triangle
用一个二维数组记录状态的值,避免重复计算#include#include #include using namespace std;#define MAX 105int D[MAX][MAX];int MaxNum[MAX][MAX];int n;int CalMax(int i,int j){ if(MaxNum[i][j]!=-1) return原创 2018-04-18 22:16:37 · 172 阅读 · 0 评论 -
动态规划之移动路线
递推,注意初始化#include <iostream>#include <stdio.h>#include <algorithm>#include <vector>#include <string>#include <map>#include <set>#include <queue&a原创 2018-04-28 20:02:38 · 883 阅读 · 1 评论 -
动态规划之摘花生
状态dp [ i ][ j ] 表示从 i 行 j 列结束的最大花生数状态转移方程dp [ i ][ j ] = max( dp [ i - 1] [ j ] ,dp[ i ][ j-1]) +1注意初始化要小心#include <iostream>#include <stdio.h>#include <algorithm>#include <vec...原创 2018-04-28 19:18:41 · 853 阅读 · 0 评论 -
动态规划之登山(上山下山分别考虑)
#include <iostream>#include <stdio.h>#include <algorithm>#include <vector>#include <string>#include <map>#include <set>#include <queue>#原创 2018-04-28 18:02:41 · 1680 阅读 · 0 评论 -
动态规划 一维背包 采药
#include <iostream>#include <stdio.h>#include <algorithm>#include <vector>#include <string>#include <map>#include <set>#include <queue>#原创 2018-04-28 17:17:09 · 113 阅读 · 0 评论 -
动态规划之切割回文
状态 dp[ i ] 表示从长度为1的位置到长度为 i 的位置的最少切割次数状态转移方程if( i 到 j 是回文串 )dp [ i ] = min ( dp[ i ] , dp[ j-1 ] + 1) #include <iostream>#include <memory.h>#include <string>using namespace std;...原创 2018-04-28 16:17:29 · 1812 阅读 · 0 评论 -
动态规划之股票买卖
确定状态 pro [ i ]表示从第一天到第 i 天能获得的最大利润 post[ i ]表示从第 i 天到第 n 天能获得的最大利润状态转移方程 pro [ i ] = max( pro[ i-1 ],price[ i ] - min )post [ i ] = max( post[ i+1 ] , max - price[ i ] )#include <iostream>...原创 2018-04-28 10:13:33 · 1075 阅读 · 0 评论 -
动态规划 背包问题 二维费用背包
裸的二维费用背包#include <iostream>#include<cstring>#include<algorithm>using namespace std;int n,m,k;int a[1005];//消耗精灵球int b[1005];int result[1005][1005];int main(){ cin >&g...原创 2018-04-27 12:03:19 · 325 阅读 · 0 评论 -
动态规划之硬币
#include <iostream>#include<cstring>#include<algorithm>using namespace std;int n,x;int kinds[2000005];//kind[i]表示构成i元的方法数int mykinds[2000005];int value[205];int result[205];...原创 2018-04-27 10:58:52 · 152 阅读 · 0 评论 -
动态规划之怪盗基德的滑翔翼
#include <iostream>#include <stdio.h>#include <algorithm>#include <vector>#include <string>#include <map>#include <set>#include <queue>#原创 2018-04-28 20:19:49 · 420 阅读 · 0 评论 -
动态规划之拦截导弹
最长下降子序列#include <iostream>#include <stdio.h>#include <algorithm>#include <vector>#include <string>#include <map>#include <set>#include <queue&am原创 2018-04-28 20:26:43 · 863 阅读 · 1 评论 -
动态规划 最大子序列和
#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<set>#include<math.h>#define IN 1<<28#de原创 2018-07-23 21:06:00 · 568 阅读 · 0 评论 -
leetcode 不同路径Ⅱ
动态规划(深搜会超时)class Solution{public: int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) { int dp[105][105]; int n = obstacleGrid[0].size();...原创 2018-05-23 22:01:35 · 456 阅读 · 0 评论 -
解码方法 leetcode
类似于爬楼梯string s;using namespace std;class Solution {public: int numDecodings(string s) { if( s.empty() || s.size() >= 1 && s[0] == '0' ) { return 0; ...原创 2018-05-23 21:33:24 · 284 阅读 · 0 评论 -
leetcode 乘积最大子序列
由于乘积时会负负得正,所以需要记录一个正的最大值和一个负的最小值。状态Posdp[i]:表示以第i个元素为结尾的子序列的最大乘积状态Negdp[i]: 表示第i个元素为结尾的子序列的最小乘积状态转移方程: Posdp[i] = max( nums[i], max( nums[i] * Posdp[i-1], nums[i] * Negdp[i-1] ) ); ...原创 2018-05-27 10:25:25 · 1296 阅读 · 0 评论 -
leetcode 使用最小花费爬楼梯
状态:dp[i]表示到达第i个阶梯需要的最小花费,小技巧是令cost[n] = 0 ,最后返回dp[n]即可状态转移方程:dp[i] = min( dp[i-2], dp[i-1] ) + cost[i];#include <vector>using namespace std;class Solution {public: int minCostClimbingStai...原创 2018-05-26 20:18:50 · 1731 阅读 · 1 评论 -
动态规划之数的划分
转化为分苹果问题#include <iostream>#include <stdio.h>#include <algorithm>#include <vector>#include <string>#include <map>#include <set>#include <queue&a原创 2018-04-29 00:05:41 · 662 阅读 · 0 评论 -
动态规划之买书
不能用常规的状态转移方程,因为会出现重复。解决方法是利用买书的种类来限制#include <iostream>#include <stdio.h>#include <algorithm>#include <vector>#include <string>#include <map>#include <set&原创 2018-04-28 21:40:45 · 314 阅读 · 0 评论 -
动态规划之最低通行费
注意边界情形#include <iostream>#include <stdio.h>#include <algorithm>#include <vector>#include <string>#include <map>#include <set>#include <queue&原创 2018-04-28 20:51:48 · 489 阅读 · 0 评论 -
动态规划之复杂的整数划分问题
注意初始值的给定#include <iostream>#include <memory.h>#define MaxLen 55using namespace std;int result1[MaxLen][MaxLen];//result1[i][j]表示将整数i划分为j个数字int result2[MaxLen][MaxLen];//result2[i][j]...原创 2018-04-26 11:51:46 · 674 阅读 · 0 评论 -
动态规划之开餐馆
递推法 人人为我型状态result[ i ] 定义为开到第i个餐馆能获得的最大利润#include <iostream>#include <memory.h>#define MaxLen 105using namespace std;int result[MaxLen];int pos[MaxLen];int pro[MaxLen];int dp(int n...原创 2018-04-26 10:58:35 · 727 阅读 · 0 评论 -
动态规划 鸣人的影分身
分苹果#include <iostream>#include <memory.h>#include <string>using namespace std;int t;int dp( int m, int n){ if( m==0 || n==0 ) return 1; if( n==1 ) retur...原创 2018-05-01 09:12:22 · 397 阅读 · 0 评论 -
动态规划 完全背包
完全背包中每种物品的数量是无穷多个。与01背包差别的地方,更新dp[i][j]是顺序更新,因为每个背包可以无限次选择,状态 dp[ i ][ j ]恰好可以由可能已经放入物品i的状态 dp[ i ] [ j - list[i].w]转换过来#include <iostream>#include <memory.h>using namespace std;int n,m...原创 2018-05-01 08:21:04 · 134 阅读 · 0 评论 -
背包问题 动态规划
简化版的01背包#include <iostream>#include <stdio.h>#include <algorithm>#include <vector>#include <string>#include <map>#include <set>#include <queue&a原创 2018-04-30 22:02:05 · 116 阅读 · 0 评论 -
动态规划之Maximum sum
最大子段和的改编版本需要注意的是初始化预处理步骤避免二重循环超时#include <iostream>#include <stdio.h>#include <algorithm>#include <vector>#include <string>#include <map>#include <set>原创 2018-04-30 21:36:14 · 294 阅读 · 0 评论 -
区间DP之合并石子
确定状态result[i][j][1]:表示合并i到j的所有石子的最高得分result[i][j][0]:表示合并i到j的所有石子的最低得分状态转移方程result[i][j][0] = min(result[i][j][0], result[i][k][0] + result[k+1][j][0] + cost(i,j) );result[i][j][1] = max(result[i][j][...原创 2018-04-30 20:49:25 · 181 阅读 · 0 评论 -
动态规划之最大子矩阵
步骤1. 枚举两行(i , j)2.将两行压缩,转换为最大子段和小技巧#include <iostream>#include <memory.h>int n;using namespace std;int a[105][105];int sum[105][105];int dp[105][105][105];int main(){ cin >&...原创 2018-04-30 20:40:44 · 341 阅读 · 0 评论 -
动态规划之最大子段和
状态b[ j ]表示以a [ j ]结尾的最大子段和状态转移方程b[ j ] = max( b[j-1] + a[ j ], a[ j ] )#include <iostream>#include <stdio.h>#include <algorithm>#include <vector>#include <string>#in...原创 2018-04-30 20:37:23 · 221 阅读 · 0 评论 -
区间dp之最大括号匹配数
#include <iostream>#include <stdio.h>#include <algorithm>#include <vector>#include <string>#include <map>#include <set>#include <queue>#原创 2018-04-30 17:08:53 · 284 阅读 · 0 评论 -
动态规划之大盗阿福
状态dp [ i ]表示以偷到i之前(包括 i,但不一定偷 i)的最大的钱数状态转移方程dp[i] = max(dp[i-1], dp[i-2] + value[i] );注意边界条件#include <iostream>#include <memory.h>#include <string>#include <stdio.h>using n...原创 2018-05-01 09:31:42 · 254 阅读 · 0 评论 -
DP入门之最大上升子序列和
每一个状态是D[i]表示以第i个元素结尾的上升子序列的和#include<iostream>#include <memory.h>#include <algorithm>#define MAX 1005using namespace std;struct node{ int num; int sum; int id;};n...原创 2018-04-19 16:24:53 · 124 阅读 · 0 评论 -
动态规划之灌溉草场
划分为的子问题为:F[x]表示喷洒范围恰好覆盖直线上的区间[0,X]时,最少需要多少个喷头。X需要满足以下条件:1.X为偶数2.X不位于任何奶牛的活动范围内3.X>=2A4.当X>2B时,存在Y∈[X-2B,X-2A]且满足上述条件时,F[x] = F[y] +1(状态转移方程)我们借助于优先级队列来找最小的F[y]当求F[X]时,必须保证队列中的点的坐标必须位于[X-2B,X-2A]...原创 2018-04-21 22:03:03 · 737 阅读 · 0 评论 -
动态规划之滑雪
L[i][j]表示从点(i,j)出发的最长的滑雪长度人人为我型:#include<iostream>#include <memory.h>#include <algorithm>#include <string.h>#include <stdio.h>#define MaxLen 10005using namespace st...原创 2018-04-21 20:08:53 · 287 阅读 · 0 评论 -
递归之简单的整数划分问题
状态dp( n , m )表示把数 n 拆分 ,拆分·出来的数字不大于 m原创 2018-04-25 18:06:09 · 399 阅读 · 0 评论 -
动态规划之方盒游戏
状态是ClickBox( i , j , extralen)表示在大块 j 的右边已经有一个长度为 extralen 的大块,且其颜色与大块 j 相同,将大块 j 和大块 extralen 合并称为大块Q,在此情况下,将大块 i~j 以及大块 extralen 都能消除所得到的最高分。整个问题就是求ClickBox( 1 , n , 0 )状态转移方程:1. 直接将Q删除,这种做法得到的最高分是C...原创 2018-04-25 17:15:48 · 397 阅读 · 0 评论 -
01背包问题改编版
f(i,j)=前i个糖果选一些构成j%k的最大值函数里的j是mod k过的,方程为f(i,j)=max(f(i,j),f(i-1,(j-a[i]%k+k)%k)+a[i]; 边界为d[i][0]=0。答案即为dp[n][0]。#include <iostream>#include <memory.h>#include <string>#include &l...原创 2018-05-01 10:21:37 · 204 阅读 · 0 评论 -
动态规划入门之背包问题
#include<iostream>#include <memory.h>#include <algorithm>#include <string.h>#include <stdio.h>#define MaxLen 13000using namespace std;int N,M;int Value[MaxLen];/*...原创 2018-04-19 17:12:41 · 80 阅读 · 0 评论 -
DP入门之最长公共子序列
Maxlen[i,j]表示s1的前i个字符和s2的前j个字符的最长公共子序列的长度#include<iostream>#include <memory.h>#include <algorithm>#include <string.h>#include <stdio.h>#define MaxLen 1005using name...原创 2018-04-19 16:48:09 · 148 阅读 · 0 评论 -
DP入门之最长上升子序列
状态D[i]的值表示以第i个元素结尾的上升子序列的最大长度#include<iostream>#include <memory.h>#include <algorithm>#define MAX 1005using namespace std;struct node{ int num; int MaxNum; int id;...原创 2018-04-19 16:30:41 · 136 阅读 · 0 评论 -
最小邮票数
背包问题#include <iostream>#include <queue>#include <memory.h>#include <stdio.h>#include <stdlib.h>#include <math.h>#include <string>#define eps 1e-6#defi原创 2018-07-12 18:50:59 · 417 阅读 · 0 评论