
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 · 350 阅读 · 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 · 716 阅读 · 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 · 416 阅读 · 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 · 1790 阅读 · 0 评论 -
hdu1231 连续子数组最大和(分治,动态规划)
1)开心,学习伪码之后,自己敲完的代码;发现《导论》在纯粹的算法知识方面比紫书讲的更细致,更好懂一些。分治策略,旨在将原先的大问题不断分解成规模小的问题,比如最大连续子数组,以中间界线分三部分,左边是中界线左边的元素,右边是中界线右边的元素,第三部分是两边都有分布的元素集合,因为最大连续子数组之和一定是这三部分之其中的一个,所以比较这三个中最大的,就是最大连续子数组之和,也是该函数的返回值。而原创 2016-03-07 21:52:27 · 1835 阅读 · 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 · 6009 阅读 · 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 · 517 阅读 · 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 · 400 阅读 · 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 · 792 阅读 · 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 · 406 阅读 · 0 评论 -
DP背包小结(2)(结构完整,内容简洁,状态方程篇)
0 背包小结2,以下状态转移代码,假设所有相关变量及数组都已初始化,物品对应体积和价值都从下标为1的数组开始存储,dp[]或者dp[][]是各个状态下的背包内所装物品1 01背包(背包总容纳bag,有type种物品,每种物品只有一个选择放还是不放,给出对应体积vlume[i]、对应价值value[i])1)二维数组(建议充分理解,而不用之做题)(因为容易忘记将因体积原因放不进去原创 2016-04-22 21:35:33 · 608 阅读 · 0 评论 -
POJ2704 DP + 记忆化搜索 + 注意中间存储数据用long long不然WA
1)注意中间存储的数可能超出int范围,所以开long long ,否则越界以后,给一个随机数,就会WA。虽然方格最大是34×34,每次选择向下或者向右,那么路径数最多可能为2^(34+34-1)-X2^(34+43+1) 可以这么理解,把正方形从左上角起点开始拆成二叉树的形式来看,诸如1 2 3 42 3 4 53 4 5 64 5 6 71、2 、3 、4原创 2016-04-23 20:58:50 · 391 阅读 · 0 评论 -
HDU3591 01 背包 + 完全背包 + 多重背包 混用
0)01 背包,完全背包, 多重背包,混用。解题关键有两个。一个是将小倩付钱和老板找零分别做一个背包,小倩多重背包,老板无限背包,这样做可以的原因是,两个背包面值相同时对应的状态总可以作为一个不变的桥梁。另一个是,处理小倩的多重背包时,采用二进制优化可以显著缩短时间,不然因为数据过多容易超时(哪怕代码有错算不出正确数据,只要超时了,就会返回超时)。二进制优化的思想,就是利用任何数都原创 2016-04-27 20:03:35 · 528 阅读 · 0 评论 -
HDU1087 / SDNU1330 求上升序列最大和
0)两个题一个意思,代码的输入输出部分稍有不同,此处用HDU提交的代码。用的动态规划。①未优化,②优化了,但是时间上差不多,可能优化的不好或者数据不是很大吧。1)HDU①:#include #include #include using namespace std;int a[1010];//valuelong long int sum[1001];int mai原创 2016-05-31 19:41:32 · 466 阅读 · 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 · 1016 阅读 · 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 · 651 阅读 · 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 · 326 阅读 · 0 评论 -
UVALive 3942 Trie+dp,白书P209
1Note:①node[maxn][27]、val[maxn],maxn应该远大于存放进该字典树的单词数量,因为Trie的叶子结点数量就已经等于单词数量了。(出现Runtime有可能就是因为数组不够大,程序越界了)②strlen()比较耗费时间,尽量减少它的使用次数,比如在insert()每一个单词时可以用,而在对于整个长字符串时用一次strlen()得到一个全局变量len即可(否则如原创 2016-10-09 17:41:11 · 373 阅读 · 0 评论