动态规划
文章平均质量分 56
hhy518518
这个作者很懒,什么都没留下…
展开
-
hdoj5273最大逆序对
#include using namespace std; int a[1005]; int dp[1005][1005];//以第i数为最大数从i到j的之间的逆序数对 int c[1005][1005];//计算所有和 int N; void init() { for (int i=0;i { for (int j=i+1;j { dp[i][j] =原创 2015-06-20 23:23:15 · 720 阅读 · 0 评论 -
poj1837 01背包类型计数
//有一个天平,天平左右两边各有若干个钩子,总共有C个钩子,有G个钩码,求将钩码全部挂到钩子上使天平平衡的方法的总数。 // 其中可以把天枰看做一个以x轴0点作为平衡点的横轴 //因为强制用所有的砝码那么与用于不用对应两种状态 //1424K 0MS #include #include #include using namespace std; #define MAXN 22 #def原创 2015-09-17 11:42:49 · 356 阅读 · 0 评论 -
hihocoder#1044状态压缩dp+滚动数组
//20ms 0#include #include #include using namespace std; #define MAXN 1500 int N,M,Q; int dp[2][MAXN];//前一次的字母以及i的前面m个字母状态 int num[2][MAXN];//记录前m个字母中1的个数 int w[MAXN]; int main() { scanf("%d %d %原创 2015-10-02 00:34:18 · 328 阅读 · 0 评论 -
poj2817状态压缩DP
//输出最大的与前一个字符相同的个数之和 //184K 0MS //主要要理解是状态压缩DP,状态是是否选择了该字符 //并且保存状态时候因为字符之间有顺序,所有需要保存最后一个字符 #include #include #include using namespace std; #define MAXN 12 static int N; static char words[MAXN]原创 2015-09-26 10:10:13 · 334 阅读 · 0 评论 -
hdoj2191多重背包化为01背包
不化为01背包情况 #include #include #include #include using namespace std; static int dp[105][105];//前i种物品价格为j的时候总重量 static int p[105],h[105],c[105]; int main() { int C; scanf("%d",&C); while(C--)原创 2015-08-04 21:28:56 · 447 阅读 · 0 评论 -
POJ1125Floyd-warshall算法模板题
//题意求出一个Num人并给出该人传递信息到最后一个收到该信息的的时间 //floyd算法模板题 //204K 0MS #include using namespace std; #define MAX_N 110 #define INF 0x3f3f3f3f static int n; static int dp[MAX_N][MAX_N]; static int G[MAX_N]原创 2015-08-03 20:41:57 · 450 阅读 · 0 评论 -
poj1141根据不同规模构造最优子问题求解DP
//按照子问题的规模来枚举解决最优子问题,类似问题有算导上的最优矩阵乘法链 //600K 32MS #include #include using namespace std; #define MAX_N 2500 #define For(i,a,b) for(int i=a;i<=b;++i) #define INF 0x3f3f3f3f static int dp[MAX_N原创 2015-07-13 22:22:21 · 477 阅读 · 1 评论 -
dilworth解决的题目poj3636,poj1631
//最小的链划分数问题。根据dilworth定理 //为最大的反链的长度 //187MS 1860K #include #include using namespace std; static const int INF = ~0U>>1; static struct node { int w; int h; bool operator<(node&rs) { return原创 2015-06-12 22:18:35 · 458 阅读 · 0 评论 -
poj2479分步DP精简成O(n)算法
//提取信息包括从s到t之间的和 //但是n较大这样dp[i][j]的形式显然不行,那么如果转换 //其实我们除了记录[i,j]之间的和那么可以记录以i开头和以i结尾两种情况 //后来发现根本不用记录以什么为开头或者结尾,每次更新前面一段值就行 //725K 438MS #include using namespace std; #define MAX_N 50010 //static in原创 2015-06-08 21:46:14 · 365 阅读 · 0 评论 -
hdoj1160最长上升子序列
//0MS 1688K #include #include #include #include using namespace std; #define MAX_N 1005 static struct mice { int w; int s; int index; }vecs[MAX_N]; static int cmp(mice&lhs,mice&rhs) { return原创 2015-05-30 22:19:39 · 430 阅读 · 0 评论 -
hdoj2151简单的计数DP
//一看题目发现跟数塔问题很类似 //提取信息 时间 位置 总数 //关于计数的简单DP //0MS 1668K #include using namespace std; #define MAX_N 110 static int N,P,M,T; static int dp[MAX_N][MAX_N];//记录第i分钟后在第j课树的总情况数目 static void DP() {原创 2015-06-03 16:38:56 · 399 阅读 · 0 评论 -
poj3342树形dp+深度搜索并确定唯一性
//树形dp入门题目 //使得每2个人之间不能有直接的上下级的关系,求最多能选多少个人出来,并且求出获得最大人数的选人方案是否唯一 //唯一性通过状态数组递归确定 //dp[i][0] = ∑max(dp[j][0], dp[j][1]) (j是i的儿子) // dp[i][1] = 1 + ∑dp[j][0] (j是i的儿子) //268K 32MS #include #include #原创 2015-05-27 22:33:34 · 360 阅读 · 0 评论 -
hdoj1003注意在寻找最优解对应的时候寻找的顺序
//提取信息起始位置,终止位置,最大和 //发现数组较大可以将保存信息改造只存储终止位置 //那么dp[i] = max(a[i],dp[i-1]+a[i]) //主意要用dp[i-1]<0判断如果小于0那么肯定不用算了这题最先算的是从前到后的 //否则直接比较大小的话dp[i]就会出现I,i在前面而不是1-i在前面 //46MS 2792K #include #include using原创 2015-06-02 00:21:17 · 581 阅读 · 0 评论 -
poj2836状态压缩DP+批量加入状态
//题意:给出n个点用长方形来覆盖,每个点能被多个矩形覆盖,矩形的边是平行于轴线的每个矩阵至少覆盖2个点(包括边界上的点) //因为所有矩阵有个整体尺寸如何选择矩形让总体面积最小 //要覆盖两个点的最小面积矩形是两个点都在对角线上 //444K 125MS #include #include #include using namespace std; #define MA原创 2015-03-04 21:04:12 · 387 阅读 · 0 评论 -
DP两道hdoj关于序列的水题hdoj1087,1159
//求最长上升序列的累积和 //思路:因为对比最长上升子序列发现对于这种需要保存的条件太多 //考虑到需要保存一个当前序列的最大值,那么可以以最大值的索引对应的累计和 //46MS 1632K #include using namespace std; #define MAX_N 1002 static int n; static int a[MAX_N]; static int dp[MA原创 2015-06-01 19:23:57 · 644 阅读 · 0 评论 -
HDOJ2059简化记录条件找出问题本质DP
//龟兔赛跑问题提取信息:加油站位置,当前加油站处的油量,到达此地的最短时间 //到达每一个事件点的时候查看上一个事件点充或者没充电到达该点的最短时间但是电量记录就会 //会繁琐,那么有什么办法可以避免这个问题呢 //后来发现其实根本不用管还剩下多少电量,只用看最后一次加油的位置是哪就行了 //46MS 1620K #include using namespace std; #define原创 2015-06-03 16:03:01 · 333 阅读 · 0 评论 -
hdoj1176用滚动数组解决的dp
//可以接住的馅饼总数类似poj2385 //提取关键信息 时间,位置,当前馅饼的总数 //但是信息量教大,那么可以化简为不同时间点,对应的不同位置 //可以拥有的馅饼的最大数量 //写出后发现可以优化只存储一个发生地点可能的苹果总数 //不过也可以转换成树塔类型以5为塔顶,对折,可以联想到数塔了吧? //78MS 6324K #include #include #include #incl原创 2015-06-01 23:17:43 · 379 阅读 · 0 评论 -
poj1042贪心方法或者dp方法
思路:首先该问题分析发现条件很多,提取条件有X位置 总钓鱼时间H,每个鱼塘当前的鱼,以及该鱼塘钓鱼了多久 首先对于位置X,并不知道最后要钓哪几个河流,那么这时候显然可以枚举 接下来分析每个鱼塘钓鱼的时间实际上就是钓鱼的次数由于如果当前确定了钓鱼的小岛个数 那么钓鱼的总时间是H-sgma(Ti),又由于对一个点的钓鱼次数对于其他点是不影响的 那么这个问题就是D = d1 + d2 +...原创 2015-06-22 13:35:17 · 494 阅读 · 0 评论 -
hiho1087状态压缩dp
//记忆话搜索方法//此题状态压缩中套用记忆化搜索的方法//并用树状数组的方法遍历子集 # include # include # include # include # include using namespace std; int n, m, dp[12][1 << 12], st[12], p[1 << 12]; int DP(int u, int s) { if (dp[u][s])原创 2016-05-11 17:51:12 · 361 阅读 · 0 评论