动态规划
单木
无脑程序猿
展开
-
最长上升子序列
//最长上升子序列 int lis(int n){ int len=1; d[0]=-INF; for(int i=1;i<=n;++i) { if(a[i]>d[len-1]) d[len++]=a[i]; else d[lower_bound(d+1,d+len,a[i])-d]=a[原创 2016-05-17 10:57:21 · 229 阅读 · 0 评论 -
动态规划
动态规划 动态规划(Dynamic Programming):是一种在数学,计算机科学,经济学中使用的,通过将原问题分解为相对简单的字问题来求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。 动态规划中的术语: 1.阶段:把问题分为几个相互联系的有顺序的几个环节,这些环节即称为阶段 2.状态:某一阶段的出发位置称为状态,通常在一个阶段中包含若干个状态 ...原创 2015-04-14 21:59:27 · 387 阅读 · 0 评论 -
01背包
hdu 2602 Bone Collector原题点击打开链接。 Tip:这里可以将每个物品都看成单独的阶段,对物品的取与不取就是决策,背包中物品的价值#include<stdio.h> #define N 1010 int dp[N][N],val[N],vol[N]; int main() { int ncase; scanf("%d",&ncase); while(n原创 2016-08-29 16:58:43 · 286 阅读 · 0 评论 -
hdu 5945 Fxx and game(dp+单调队列)
题意一个数由x变到1,有两种操作,减去一个1到t的数或除以k(前提是能整除),问最少操作是多少。代码/* ******************************** Author : danmu Created Time : 2016年11月01日 星期二 00时08分02秒 File Name : a.cpp ***********************原创 2016-10-31 20:07:33 · 283 阅读 · 0 评论 -
hdu 1011 Starship Troopers(树形背包)
题意一棵树,花费一定,使得获得的价值最大思路规范的树形背包,过程不是很理解。代码#include<cstdio> #include<vector> #include<cstring> #include<algorithm> using namespace std; const int Ni=110; int n,m; int coss[Ni],weg[Ni]; int dp[Ni][Ni]; boo原创 2016-12-27 17:38:54 · 317 阅读 · 0 评论 -
最长公共子序列
算法简介:考虑最长公共子序列问题如何分解成子问题,设A=“a0,a1,…,am-1”,B=“b0,b1,…,bm-1”,并Z=“z0,z1,…,zk-1”为它们的最长公共子序列。不难证明有以下性质: (1) 如果am-1=bn-1,则zk-1=am-1=bn-1,且“z0,z1,…,zk-2”是“a0,a1,…,am-2”和“b0,b1,…,bn-2”的一个最长公共子序列; (2) 如果am-1!=转载 2016-05-26 22:13:42 · 248 阅读 · 0 评论 -
hdu 1024 Max Sum Plus Plus
题意 n个数取m个不重合的部分使和最大,求这个最大值。 思路 枚举比大小的思路肯定不可取,尝试动态规划。 动态规划最自然的想法是:求n个数取若干部分和的最大值,子问题就是对n-1个数取若干部分的最大值。 设a[n]为n个数的序列,dpp[n][m]为n个数取m部分的最大值,可以有两种决策达到dp[n][m]的状态: 第n个数构成第m部分 第n个数不构成第m部分 所以状态转移方程,1≤x≤n−m...原创 2018-10-07 16:59:04 · 181 阅读 · 0 评论