DP
文章平均质量分 56
Dilly__dally
这个作者很懒,什么都没留下…
展开
-
HDU 2955
思路:背包问题,原先想的是把概率当做背包,在这个范围内最多能抢多少钱。但是问题出在概率这里,一是因为概率是浮点数,用作背包必须扩大10^n倍来用。二是最大不被抓概率不是简单的累加。二是p = (1-p1)(1-p2)(1-p3) 其中p为最大不被抓概率,p1,p2,p3为各个银行被抓概率。第二次想到把银行的钱当做背包,把概率当做价值,总容量为所有银行的总钱数,求不超过被抓概率的情况下,最大的背包容...原创 2018-05-17 17:18:01 · 110 阅读 · 0 评论 -
CodeForces - 103D(分块+dp)
题意:给你n个数,p个查询,每次查询下标为a,a+b,a+2b……的和。思路:对n分块,b>时,可以直接暴力求和,最大扫描次数为O();b<=时,用一个dp[j]存放从第j个数出发求得的和,容易得出dp[j]=dp[j+b]+a[j](这里设a为数据数组,下面的a和题意相同),为了更优化,更新dp之前先判断这一次询问的b是不是和上一次相同,如果相同,那么可以直接使用上一次得出的dp...原创 2019-01-16 21:48:29 · 356 阅读 · 0 评论 -
POJ 1159(最长公共子序列+滚动数组)
题意:最少插多少个字符到原字符串使之变成回文串。思路:求字符串和字符串的逆序的最长公共子序列,然后用总长度n-公共长度。交一发MLE……5000*5000的int数组超内存,只能思考用滚动数组来解决。我们考虑LCS的DP过程,设dp[i][j]为两字符串的前i和前j个最长公共子序列长度,当s[i]==ss[j]时,dp[i][j]=dp[i-1][j-1]+1;当s[i]!=ss[j]时,dp...原创 2019-01-13 14:06:06 · 879 阅读 · 1 评论 -
HDU 6446 Tree and Permutation(找规律+树形DP)
题意:给一棵N个点的树,对应于一个长为N的全排列,对于排列的每个相邻数字a和b,他们的贡献是对应树上顶点a和b的路径长,求所有排列的贡献和。思路:对于任意的xy,其在全排列中相邻的组合数是(n-1)!*2,这样题目意思就明了了,求一棵树中任意两点距离和,边上有权重。贡献思维,看每条边对答案的贡献。一条边被n1*n2次走过,n1,n2分别为边两边的子树的节点数。每条边两端的点数的计算,实际上...原创 2018-08-27 23:47:37 · 209 阅读 · 0 评论 -
HDU 3033
方法:分组背包。题意:某人要买鞋子,有k种鞋,要求每种鞋至少买一双,给出每双鞋子的花费和价值,问m元钱可以买到的鞋子的最大价值是多少。思路:背包九讲讲的是每组至多选一个,此题是每组至少选一个,所以dp[i][j]代表前i组money为j最多买到的价值。初始化方面要注意,先将全部初始化为-1表示不存在,为了计算从第一维到第k维,要将dp[0]初始化为0。然后先枚举每一组,再枚举每一组的鞋子,最后一层...原创 2018-05-21 19:16:57 · 226 阅读 · 0 评论 -
HDU 2159
思路:二维背包,确定什么是背包很重要,然而我对这方面还是不熟练,此题用s(杀怪的个数)和忍耐度m作为背包的两个容量,如果价值(经验)大于等于n,则升级,借助中间变量ans来找到最小忍耐值,如果最小忍耐值大于m,则输出-1,否则输出m-ans。#include<bits/stdc++.h>using namespace std;#define inf 0x3f3f3f3f#defi...原创 2018-05-20 21:30:27 · 156 阅读 · 0 评论 -
HDU 2844
思路:多重背包,dp[i]表示价格总数为i能凑出来的最大价格,比模板多了的唯一一点是查多少数字出现过,枚举一遍dp[i]==i的个数。#include<bits/stdc++.h>using namespace std;#define inf 0x3f3f3f3f#define ll long long#define fo freopen("in.txt","r",stdin)...原创 2018-05-20 19:48:19 · 223 阅读 · 0 评论 -
背包模板(01、完全、多重)
#include <stdio.h>#include <string.h>int max(int a, int b){ if (a > b)return a; return b;}#define maxn 100005int c[maxn], w[maxn], num[maxn];//c:费用 w:价值 num:数量int dp[maxn]; ...转载 2018-05-19 15:44:04 · 169 阅读 · 0 评论 -
HDU 5534
题意:告诉你有n个结点,f(i)表示度为i的结点的cool值,现在你需要做的就是加n-1条边,构成一棵树,并使得这棵树的每个结点的cool值之和,即coolness最大,输出最大的coolness。思路:完全背包。知识点:有n个结点的树有2*n-2个度(入度+出度)。详细方法:因为每一个结点至少有一个度,所以初始化dp[0]=n*f(1),其余初始化为0。问题就转化为了把2*n-2-n个度分配到这...原创 2018-05-19 11:55:24 · 149 阅读 · 0 评论 -
HDU 1114
每种硬币数量不限,所以是完全背包。条件必须在装满的情况下,求最小价值,那么初始化变为装满的情况(背包九讲)和max变为min。如果遍历完物品后满容量的dp值没有被改变则说明这些硬币无法组成这个容量。由于数据10000,所以就不用二维的了。#include<bits/stdc++.h>using namespace std;#define inf 0x3f3f3f3f#define...原创 2018-05-18 22:16:47 · 188 阅读 · 0 评论 -
CF 366C(01背包)
把a-b*k视为重量,a视为价值,背包,因为a-b*k有负数情况,所以要考虑负数容量的情况把a-b*k视为重量,是因为这样就可以叠加,当a=b*k时,也就是重量为0的状态, 初始没有物品时,重量也为零,所以dp数组初始化要讲重量为0(dp【0】)赋为零,而其余状态刚开始并不存在,所以都赋为负无穷 01 背包 以 a[i] -k* b[i]作为每个物品的重量,以a[i]作为价值 ,...原创 2018-05-18 18:13:38 · 326 阅读 · 0 评论 -
HDU 2546
DP思路:先拿5元出来,对价格排序,把最大的先放一边,对剩下的01背包。状态转移方程: dp[j]=max(dp[j],dp[j-a[i]]+a[i]);注意:1、n=1时直接输出m-a[0];2、m<5时输出m;3、其余情况01背包#include<bits/stdc++.h>using namespace std;#define inf 0x3f3f3f3f#defin...原创 2018-05-17 20:28:07 · 110 阅读 · 0 评论 -
POJ 3624
思路:DP+一维数组(滚动数组)一般的状态转移方程是:dp[i+1][j]=max(dp[i][j],dp[i][j-w[i]]+v[i]此题用二维数组会超内存。如图:原创 2018-05-17 17:31:19 · 266 阅读 · 0 评论 -
PTA天梯L3-020 至多删三个字符(dp)
题意:给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串?思路:果断dp。设dp[i][j]为前i个字符删掉j个字符的结果。从删掉一个字符开始想,如果当前字符和上一个字符相等,那么重复的情况只有1种,就是删掉重复的字符其中一个;如果不等,那么考虑删或者不删这个字符,结果就等于i-1个字符删与不删的情况之和。删掉两个字符类似,如果当前字符和上一个...原创 2019-03-03 14:44:53 · 588 阅读 · 0 评论