![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ACM 动态规划
文章平均质量分 70
嚜寒
盖士人读书,第一要有志,第二要有识,第三要有恒。
有志则不甘为下流;
有识则知学问无尽,不敢以一得自足,如河伯之观海,如井蛙之窥天,皆无识者也;
有恒则断无不成之事。
展开
-
POJ3071 概率DP
1 归根结底是DP问题,利用概率的知识写出状态转移方程,依然是确定两件事: ①分阶段 ②递推方向和递推边界 #include #include #include using namespace std; double dp[7+1][256+1]; double p[256+1][256+1]; int total; const double eps=1e-8; int bottom原创 2016-09-07 21:05:32 · 312 阅读 · 0 评论 -
HDU4508 DP + 裸 + 完全背包
1) #include #include #include using namespace std; const int maxn=110000; long long int dp[maxn]; int a[maxn]; int b[maxn]; int main() { int m; while(cin>>m){ if(m100){原创 2016-04-22 20:43:23 · 684 阅读 · 0 评论 -
POJ3254 状态压缩+dp
#include #include #include #include ///我不懂,你为什么老是把数组啊下标啊什么的写错?for(i<cur),你用cur去判断?无语,脑子呢 ///因为地图的行数和列数都小于30(int最大是2^31-1,所以每一行或者每一列能压缩到一个int数即可),且每个点只有两个选择(要么为0要么为1),所以每行或者每列可以压缩成一个状态(这里选择行),一行之中可原创 2016-09-04 00:14:11 · 389 阅读 · 0 评论 -
POJ2533 DP入门级题目-最大上升子序列(LIS)-O(n^2)与O(nlogn) (变形,POJ1631)
1) #include //入门DP问题,时间复杂度O(N^2) using namespace std; int main() { int a[1010];//输入元素 int d[1010];//d[i]代表以a[i]为最后一个元素的序列的长度 int n;cin>>n; for(int i=1;i>a[i];原创 2016-02-26 21:34:51 · 1755 阅读 · 0 评论 -
hdu1231 连续子数组最大和(分治,动态规划)
1)开心,学习伪码之后,自己敲完的代码;发现《导论》在纯粹的算法知识方面比紫书讲的更细致,更好懂一些。 分治策略,旨在将原先的大问题不断分解成规模小的问题,比如最大连续子数组,以中间界线分三部分,左边是中界线左边的元素,右边是中界线右边的元素,第三部分是两边都有分布的元素集合,因为最大连续子数组之和一定是这三部分之其中的一个,所以比较这三个中最大的,就是最大连续子数组之和,也是该函数的返回值。而原创 2016-03-07 21:52:27 · 1778 阅读 · 0 评论 -
DP背包问题小结(01背包,完全背包,需恰好装满或不需,一维DP、二维DP)
1) 01背包基础,求背包所装物品价值之和的最大值,不要求恰好装满时,采用易于理解的二维DP数组存储。 #include #include using namespace std; int dp[1010][1010]; int vp[1010]; int wp[1010]; int main() { int kase;cin>>kase; while(kase--)原创 2016-03-17 22:53:17 · 5908 阅读 · 0 评论 -
HDU2084 DP + 水 /入门+ 递推 + 从后往前思考问题的方式
1) #include #include #include using namespace std; const int maxn=110; vector shuta[maxn]; int main() { int C; cin>>C; while(C--){ int n; cin>>n; int a; for(int i=1;i<=n;i++){ int原创 2016-04-18 20:26:06 · 476 阅读 · 0 评论 -
HDU2602 DP + 裸 + 01背包
1) #include #include using namespace std; const int maxn=1010; int value[maxn]; int volume[maxn]; long long int dp[maxn]; int main() { int kase; cin>>kase; while(kase--){ memse原创 2016-04-22 20:41:52 · 362 阅读 · 0 评论 -
HDU2191 DP + 裸 + 多重背包
1)都是一维数组,但是状态转移方程的for循环稍有不同。都是利用倒序时 每一种物品都只放一个的特性,前者是该类物品放k次每次都放一个,后者是该类物品放一次 一次从1到k 放入个数依次增大 #include #include const int maxn=110; int dp[maxn]; int money[maxn]; int weight[maxn]; int number[m原创 2016-04-22 21:00:41 · 749 阅读 · 0 评论 -
HDU2159 DP + 裸 + 二维费用(每个物品对应两种费用) + 完全背包
1 #include #include #include using namespace std; const int maxn=1100; long long int dp[maxn][maxn]; int exr[maxn]; int ren[maxn]; int main() { int n,m,k,s; while(cin>>n){ memset(d原创 2016-04-22 21:28:54 · 373 阅读 · 0 评论 -
DP背包小结(2)(结构完整,内容简洁,状态方程篇)
0 背包小结2,以下状态转移代码,假设所有相关变量及数组都已初始化,物品对应体积和价值都从下标为1的数组开始存储,dp[]或者dp[][]是各个状态下的背包内所装物品 1 01背包(背包总容纳bag,有type种物品,每种物品只有一个选择放还是不放,给出对应体积vlume[i]、对应价值value[i]) 1)二维数组(建议充分理解,而不用之做题)(因为容易忘记将因体积原因放不进去原创 2016-04-22 21:35:33 · 578 阅读 · 0 评论 -
POJ2704 DP + 记忆化搜索 + 注意中间存储数据用long long不然WA
1)注意中间存储的数可能超出int范围,所以开long long ,否则越界以后,给一个随机数,就会WA。 虽然方格最大是34×34,每次选择向下或者向右,那么路径数最多可能为2^(34+34-1)-X 2^(34+43+1) 可以这么理解,把正方形从左上角起点开始拆成二叉树的形式来看,诸如 1 2 3 4 2 3 4 5 3 4 5 6 4 5 6 7 1、2 、3 、4原创 2016-04-23 20:58:50 · 355 阅读 · 0 评论 -
HDU3591 01 背包 + 完全背包 + 多重背包 混用
0)01 背包,完全背包, 多重背包,混用。 解题关键有两个。 一个是将小倩付钱和老板找零分别做一个背包,小倩多重背包,老板无限背包,这样做可以的原因是,两个背包面值相同时对应的状态总可以作为一个不变的桥梁。 另一个是,处理小倩的多重背包时,采用二进制优化可以显著缩短时间,不然因为数据过多容易超时(哪怕代码有错算不出正确数据,只要超时了,就会返回超时)。 二进制优化的思想,就是利用任何数都原创 2016-04-27 20:03:35 · 497 阅读 · 0 评论 -
HDU1087 / SDNU1330 求上升序列最大和
0) 两个题一个意思,代码的输入输出部分稍有不同,此处用HDU提交的代码。 用的动态规划。①未优化,②优化了,但是时间上差不多,可能优化的不好或者数据不是很大吧。 1)HDU ①: #include #include #include using namespace std; int a[1010];//value long long int sum[1001]; int mai原创 2016-05-31 19:41:32 · 434 阅读 · 0 评论 -
POJ1276 找零钱(多重背包 或 二进制拆分 或 递归)
0) 1)多重背包 【注意,使用number数组存储 第i个物品在当前背包装入总金额为j的情况下 使用的个数,从而用更大的空间开销换取更快的时间,AC代码和超时代码分别如下:】 AC: #include #include #include //找零钱问题==多重背包(每种面值有数量限制) using namespace std; const int MAXN=10原创 2016-07-28 16:10:03 · 956 阅读 · 0 评论 -
POJ2342 简单树形DP(两种树的表示结构,点为主和边为主)
1 以边为主,速度更快一些 #include #include #include #include #include using namespace std; const int maxn=6010; int head[maxn]; int visted[maxn]; int dp[maxn][2]; int cnt=0; struct Edge{ int u;//出发点原创 2016-09-01 15:23:10 · 600 阅读 · 0 评论 -
HDU5256 LIS变形
奇妙。 #include #include #include using namespace std; const int maxn=1e5+10; int a[maxn],dp[maxn]; int len; int n; int main() { int t; scanf("%d",&t); for(int kk=1;kk<=t;kk++){原创 2016-10-07 22:17:16 · 298 阅读 · 0 评论 -
UVALive 3942 Trie+dp,白书P209
1 Note: ①node[maxn][27]、val[maxn],maxn应该远大于存放进该字典树的单词数量,因为Trie的叶子结点数量就已经等于单词数量了。(出现Runtime有可能就是因为数组不够大,程序越界了) ②strlen()比较耗费时间,尽量减少它的使用次数,比如在insert()每一个单词时可以用,而在对于整个长字符串时用一次strlen()得到一个全局变量len即可(否则如原创 2016-10-09 17:41:11 · 326 阅读 · 0 评论