动态规划
Below_Crusder
这个作者很懒,什么都没留下…
展开
-
Codeforces PROB training 31.MAY
B. Sea and IslandsTime Limit: 1000msMemory Limit: 262144KB64-bit integer IO format: %I64d Java class name: (Any)Submit Status PID: 49309A map of some object is a rectangular field consisting of n原创 2015-05-31 22:53:37 · 323 阅读 · 0 评论 -
zoj 3872(dp)
//题意:求一段序列里有多个连续的子序列 每个连续子序列中各个元素(相同的只算一个)相加之和为n // 求所有这样的n累加之和//方法:动规的思想 dp[i]表示以第i个元素为右顶点的所有区间的累加和// 利用pre数组 pre[i] 记录的是元素i上一次出现的位置// ss数组保存这段序列////状态转移方程:dp[i] =原创 2016-03-30 17:17:27 · 321 阅读 · 0 评论 -
poj 1321 状态压缩dp||dfs
状态压缩dp//// main.c// example//// Created by Adam on 15/2/2.// Copyright (c) 2015年 Adam. All rights reserved.//#include #include "stdio.h"#include原创 2015-10-12 17:31:00 · 440 阅读 · 0 评论 -
zoj 3777(状态压缩dp)
// 题意:求一个长度为n的序列 所有的排列组成的疲劳值大于m的数量// 也就是求一个矩阵每行每列只能取一个得到的所有数字大于m共有多少种// n最大为12 m最大为500 所以采用状态压缩// 学习了别人的思路 dp[i][j] 表示状态为i,疲劳值大于等于j的排列有多少种// 接着就是由dp[i][j]推导出 dp[(1<<n) - 1][m] 即可#include #includ原创 2016-04-05 17:59:59 · 687 阅读 · 0 评论 -
poj 3254(状态压缩dp)
// 题意:有一个n*m的矩阵 0代表不能种 1代表能种 求共有多少种种植方式// dfs肯定超时 用状态压缩dp// 最开始觉得状压dp也不是很省时 看别人博客优化// 利用st数组来优化 st[i]表示第i行可以达到的最大状态 比如这一行为111 那么对应的二进制数就是 1+2+4 = 7// 学习了别人的思路 dp[i][j] 表示第i行,状态为j的种植方式有多少种// dp[i]原创 2016-04-06 17:30:40 · 367 阅读 · 0 评论 -
poj 2411 (状态压缩dp)
//题意:一个n*m的矩形用 1* 2 的卡牌填满 问共有多少种方法//方法:状态压缩+动规的思想 dp[i][j] 表示前i -1行全部填满 第i行状态为j的方法总和// 状态J的二进制状态 0 表示该位被占用了 1 代表 该为是空的//状态转移方程:dp[i][j] = sum(dp[i - 1][k]) (状态j可由状态k推出)//起初有一个地方我有点模棱两可原创 2016-04-07 13:47:53 · 462 阅读 · 0 评论 -
hdu 1421(dp)
//题意:中文的就不说了//方法:首先先排序 dp[i][j] 表示前i个物体取j件的最优疲劳值//状态转移方程:dp[i][j] = min(dp[i-1][j], dp[i - 2][j - 1] + (cost[i] - cost[i - 1]) * (cost[i] - cost[i - 1]))// dp[i - 1][j] ,(第i件物体不取)//原创 2016-03-26 15:32:41 · 320 阅读 · 0 评论 -
hdu 1058
// 打表#include #include #include #include #include #define maxn 0Xfffffffusing namespace std;int dp[5850], pos;int i, j, k, l;int MIN_(){ int x = min(min(dp[i] * 2, dp[j] * 3), min(dp[k原创 2016-03-26 16:32:36 · 311 阅读 · 0 评论 -
SGU 223(状压+dp)
// 题意:在一个n * n的棋盘上,放k个棋子使得每个棋子的周围八个区域都不得有其他棋子,问这样放置共有多少种// 方法:状压+dp的水题 这几天都要被状压弄疯了// dp[i][j][k] 代表第i行状态为j棋盘上总共放了k个棋子的方案数// 然后由此行的状态j推出下一行不冲突的状态l就好了// 巧妙利用 位运算和与运算来判断冲突 又快又方便#include "iostream"#原创 2016-04-14 21:22:05 · 491 阅读 · 0 评论 -
SGU 131(状压压缩+dp)
// 题意:一个n*m的矩阵,求用I型(1 * 2)和L型的两种方块进行填满有多少种方法// 方法:这题和poj2411有点类似 做过方块填充的应该都认得出来要用状压// 但是要比poj2411复杂 思路也是类似 不过因为要考虑L型 情况也复杂的多// 语文有点不太好 可能有点说不清楚// 利用两个参数 b1 表示前面的放置方式对now(当前行状态)的当前列的影响,b2 表示对pre(上原创 2016-04-14 23:14:35 · 593 阅读 · 0 评论 -
HDU 1176(dp)
//方法:dp[i][j] 代表第i秒在j位置上的采到的最多的馅饼的数量#include #include #include #include using namespace std;const int maxn = 1e5 + 5;const int mxn = 1e5;int dp[maxn][11];int main(){ int t; while(ci原创 2016-05-12 23:50:39 · 438 阅读 · 0 评论 -
HDU 1074(状态压缩dp)
//起初想到贪心没思路 看了题解 状态压缩DP 最多15个状态// [1, 1<<n) 枚举各个状态推出的每种可能即可//注意题意说如果答案相同输出字典序最优的答案//只需要在枚举的时候处理下就好 这里理解了好一会儿 #include #include "stdio.h"#include "stdlib.h"#include "string.h"#include "algorith原创 2015-11-28 16:47:02 · 361 阅读 · 0 评论 -
HDU 2077(dp)
//题意:中文题就不说了//方法:求dp[n](n块盘子需要多少步从最左边移到最右边)// 1. 将上面的n-1块圆盘先从最左边移到中间 .......................需要a步// 2. 第n块(最大的)盘子直接通过中间放在最右边 ...........需要2步// 3. 再将n-1块圆盘从中间移到右边..原创 2015-11-27 21:31:49 · 360 阅读 · 0 评论 -
HDU 4521(dp)
// 类似于lis的求解 就是增加了下标之间的差值要满足大于d 有些不同 好好理解了下还是有点模糊的 以后还得再琢磨琢磨// main.c// example//// Created by Adam on 15/2/2.// Copyright (c) 2015年 Adam. All rights reserved.#include #include "stdio.h"原创 2015-11-27 16:43:09 · 393 阅读 · 0 评论 -
hdu 1003
Max SumTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 172541 Accepted Submission(s): 40197Problem DescriptionGiven a sequenc原创 2015-06-07 15:11:37 · 246 阅读 · 0 评论 -
HDU2546 (01背包)
01背包题注意留出五块钱减去最贵的商品即可#include "iostream"#include #include #include #include "string.h"#include "math.h"using namespace std;int cmp(int a,int b){ return ab;}int main(){ int n,原创 2015-11-05 16:19:52 · 315 阅读 · 0 评论 -
hdu 1069 dp
题意:给出n个砖块(长,宽,高) 砖块有很多摆法比如10*20*30的砖块 有(10 20 30)(10 30 20)(20 10 30)(20 10 30 )等种摆法利用这些砖块叠出塔形建筑 即下面的砖块长和宽一定要比上面的大 求满足条件的塔形建筑的最大高度思路:进行排序按照砖块的长和宽进行升序排序 然后利用DP逐一推倒即可#include #i原创 2015-08-14 20:20:35 · 261 阅读 · 0 评论 -
HDU5256 序列变换(LIS求严格上升子序列)
//求严格递增上升子序列len 然后结果n-len//严格上升子序列只需建立一个 ss[i]-i数组 然后求解一般的LIS即可#include #include "stdio.h"#include "stdlib.h"#include "string.h"#include "algorithm"#include using namespace std;int ss原创 2015-11-07 17:28:16 · 572 阅读 · 0 评论 -
dp求最大子段(一维数组,二维数组)
例如一位数组 ss[]={12,-4,-6,2,-4,8,-6,11,-3} 求子串最大值 非常简单的dp#include #include "string.h"int main(){ int ss[]={12,-4,-6,2,-4,8,-6,11,-3},dp[9],max=0; memset(dp,0,sizeof(dp));原创 2015-05-28 21:00:02 · 600 阅读 · 0 评论 -
HDU 1619(dp)
// 题意:从矩形左边到达右边使得走过的格子的权值相加最小 结果相同按照字典序小的输出// 方法:从右向左一列一列处理 用一个相同大小的数组记录当前格子下一步选择的方向// 这样推到第一列之后就可以再推回去将序列输出// 在选择方向的时候可以稍微处理下 就可以保证得到的序列字典序列一定是最小的// main.c// example//// Creat原创 2015-11-15 21:22:36 · 350 阅读 · 0 评论 -
ZOJ 3469(区间DP)
//第一次做区间DP的题 看了别人的题解写的//解法只要将各个点(包括餐厅的位置)按照距离原点的距离升序排序//然后从餐厅这个点开始向两侧区间DP// dp[i][j][0] 表示 当前点送完了区间[i,j]的外卖并且在区间的左端点I点// dp[i][j][1] 表示 当前点送完了区间[i,j]的外卖并且在区间的右端点J点//那么dp[i][j][0] 可由dp[i+1][j][0]原创 2015-11-17 20:02:26 · 370 阅读 · 0 评论 -
HDU 1158(dp)
// 题意:给定n个月 雇佣工人的钱 工人每个月的工资 解雇工人付的钱// 以及每个月所需要的工人人数 让你求出满足条件的最省钱的花费代价// 方法:暴力dp就好了 dp[i][j]表示 第i个月结束的时候雇佣j个人所需要的最小代价// main.c// example//// Created by Adam on 15/2/2.// Copyright (原创 2015-11-18 21:50:42 · 311 阅读 · 0 评论 -
HDU 2569(递推)
//题意是中文的 大家都看得懂//方法:dp[i]就是长度为i第一个格的颜色为红色总共有多少种方法// 所以要乘上3才是答案// 由dp[i-1]推dp[i]的时候 第i块放在第二个位置考虑 // 这样的话,第i块有两种可能// 与第一块同色 这样有dp[n-2]种//原创 2015-11-24 18:17:40 · 826 阅读 · 1 评论 -
ZJU 3469(区间DP)
//题意:给定n, v, x 分别表示有n个顾客,速度是1/v,初始位置,然后有n行分别输入每个顾客的左边 和 每分钟增加的厌恶值,让你输出最小的厌恶值//#include #include "stdio.h"#include "stdlib.h"#include "string.h"#include "algorithm"#include #include #define N原创 2015-11-27 21:47:18 · 404 阅读 · 0 评论 -
HDU 1171(背包)
#include #include #include #include using namespace std;int dp[250005];int val[5005];int sum;int main(){ int t, a, b, cnt; while(cin>>t && ( t > 0)) { cnt = 0; sum原创 2016-05-14 16:46:20 · 387 阅读 · 0 评论