
===DP===
文章平均质量分 67
lyc1635566ty
这个作者很懒,什么都没留下…
展开
-
DP+树状数组优化-sort it-neu2016第一次月赛
问题 F: Sort It时间限制: 6 Sec 内存限制: 128 MB提交: 31 解决: 9[提交][状态][讨论版]题目描述You are given a permutation of length n:p1,p2,...pn.Consider arrays of length n with possibly equal number from 1 to n.原创 2016-02-20 16:41:21 · 363 阅读 · 0 评论 -
HDU-5576-数位DP(记忆化搜索)
题意:一个字符串由数字和*号组成,每次操作可以交换其中任意两个数字,问K次操作后,所有可能结果的和思路:可以针对其中三个数进行操作操作分为1.三个数内的操作2..三个数外的操作3.三个数内的一个数和外面的数的操作然后就可以递归求解,再加一个记忆化搜索#includeconst long long mod=1000000007;using namespace std;i原创 2016-08-02 00:41:58 · 1057 阅读 · 0 评论 -
HDU-5800-To My Girlfriend-DP
题意:f(i,j,k,l,m)表示必选a[i],a[j]必不选a[k],a[l],加起来总和为m的个数。求1思路:显然是一个DP设dp[i][j][s1][s2] 为选前i个数字,总和为j,确定必选的s1个,确定必不选的s2个,的个数显然dp[i][j][s1][s2]=dp[i-1][j][s1][s2]+dp[i-1][j][s1][s2-1]+dp[i-1][j-a[i]][s1原创 2016-08-06 13:38:20 · 298 阅读 · 0 评论 -
HDU-5806-NanoApe Loves Sequence Ⅱ-DP+队列维护
题意:一串有n个数的数列,其中,第k大的数字不小于m的连续子序列有多少。思路:可以用队列gg维护一个当前最近的k个不小于m的数字,dp[i]表示到当前位置的种数如果当前位置小于m,dp[i]=dp[i-1]+gg.front(); ps.dp[i-1]表示当前数字直接加到之前的情况的后面,gg.front()表示包括最近的m个数字的区间向前伸展,个数即为当前k个不小于m的数字最前面原创 2016-08-07 15:51:11 · 230 阅读 · 0 评论 -
HDU-1992-Tiling a Grid With Dominoes-4列n行的骨牌-轮廓线DP
题意:在n*4的矩阵里,填满1*2的骨牌,有多少种可能性,我想的方向是4列n行思路:分为三种情况。1.当前列上一行把这一行给占有了,当前行不能再放。2.当前列上一行没有把这一行给占用,肯定可以竖这放。此时需要占有下一行。3.当前列和下一列上一行都没把这一行给占用。可以横着放。此时不需要占有。暴力枚举上一行对这行状态影响,然后dfs枚举出这一行对下一行的状态dfs(s,ss,x,原创 2016-08-08 22:49:14 · 539 阅读 · 0 评论 -
POJ-2411-Mondriaan's Dream-轮廓线dp(插头dp)
题意:在n*m的方格里铺1*2的骨牌,有多少种可能,首先可以排除一些特殊情况,n*m是奇数,就是0n或m是1就是1(已经排除n*m的情况)。然后就和我之前写的hdu1992的插头dp一样#include#include#include#include#includeusing namespace std;long long dp[15][4444];int m;void d原创 2016-08-09 00:31:52 · 1002 阅读 · 0 评论 -
HDU-5816-Hearthstone-DP+数学推导
题意:有两种牌,A使用后可以再抽两张牌,B使用后可以减少对方x点生命值,对方开始p点生命值思路:因为每次抽牌,结束时要不就是xa+1=xb或者是全部取完(n>=m)所以先DP初始化一下dp[i][j]表示抽出i张A卡和j张B卡的合法种数然后dfs暴力枚举一下f[i]表示i张B大于p的种数最后对于每一种i-1张A和i张B都有 ans+=C(n,i-1)*fac[i-1]*dp原创 2016-08-11 00:51:57 · 299 阅读 · 0 评论 -
CSU-1804-有向无环图-拓扑排序+DP
CSU-1804-有向无环图-拓扑排序+DP题目链接:link text思路:可以先求出所有的 ∑nj=1cout(i,j)∗b[j]\sum^{n}_{j=1} cout(i,j)*b[j] 最后成一个a[i]就可以了。至于前面的那一部分的求法可以使用拓扑排序,逆向求。建立一个反向图,然后从入度为0的点开始求在该点的后继节点中累加上当前的ans加上b[当前节点]b[当前节点]。既ans[后继节点]原创 2016-09-06 19:39:13 · 455 阅读 · 0 评论 -
HDU-1069-Monkey and Banana-DP
题目连接题意:n个箱子,每个箱子有无数个,有长宽高,一个箱子要放在另外一个箱子上的条件是 长宽严格小于下面那个。并且箱子可以自由反转思路:说是无数个,其实每个箱子最多用三次。提取出每个箱子的长宽,以长宽为关键字排序。进行dpdp[i]=max(dp[j]+a.h)dp[i] = max(dp[j] + a.h)#include<bits/stdc++.h>using namespace std;原创 2017-06-19 18:02:59 · 244 阅读 · 0 评论 -
POJ-2184-01背包变形
题目链接题意:给你一群奶牛,每个奶牛都有两个属性,si和fis_i和f_i ,这两个都有可能是负数。问:选任意头奶牛,使得这些奶牛两个属性全加起来最大。并且保证si和fis_i和f_i 分别的和大于0思路:因为涉及负数,所以将dp范围扩大两倍,我这里以100000为0分开。最后枚举的时候从100000开始。dp[i]表示s[i]的和为i的最大f和。#include<cstdio>#include<原创 2017-07-22 15:54:34 · 251 阅读 · 0 评论 -
hdu-5787-K-wolf Number-数位DP
题意:L到R闭区间中,有多少个数满足连续K位不相等思路:典型的数位DP#includeusing namespace std;long long dp[20][15][15][15][15];//num,p1,p2,p3,p4//num当前枚举的位数,p1到p4当前位置前四个状态//只有flag为0时的值才被记忆话搜索int dit[20];int k;bool pan(in原创 2016-08-03 23:49:21 · 309 阅读 · 0 评论 -
HDU-5781-ATM Mechine-DP
题意:在不超过w次警告的情况下,确认自己存了多少钱的操作次数的期望,钱的范围为0到K分析:正常的可以想到用二分操作,但是二分操作不一定是最优的操作。我们必须通过DP来令dp[i][j]为0-i区间内还可以被警告j次的确认总数,最后再除以k+1就好了很容一得到,dp[i][j]=min(dp[i-k][j]+dp[k-1][j-1]+i+1); 其中dp[i-k][j]是区间上部分原创 2016-08-03 14:19:34 · 359 阅读 · 0 评论 -
POJ3254-Corn Fields-状压DP
题意:一个网格农场,每个格子上1表示可以放牛0表示不能放牛,相邻的格子不能放牛,问有多少种方法。n这是经典的状压DP。第一次写,发现位运算好神奇。#include#include#include#include#include#define mod 100000000using namespace std;int dp[20][5000]; //dp[原创 2016-04-06 00:49:09 · 298 阅读 · 0 评论 -
HDU5691-Sitting in Line-状态压缩
题意:大概是有n个数,正数负数都有,n思路:看到n#include#define INF 0x3f3f3f3fusing namespace std;int dp[1<<20][20];int a[20];int p[20];int num(int x) { int ans=0; while(x&-x) { ans++;原创 2016-05-24 00:18:39 · 426 阅读 · 0 评论 -
HDU 5136 (DP)
题目链接:这里题意:求深度为n的无根树有多少种构型。思路:分为两种情况,n为奇数或者偶数首先令dp[i]dp[i]为深度为k的子树的个数dp[i]=∑k−2j=0dp[i]+(dp[k−1]∗dp[k−1]+dp[k−1])/2dp[i]=\sum^{k-2}_{j=0}dp[i]+(dp[k-1]*dp[k-1]+dp[k-1])/2ps:(dp[k−1]∗dp[k−1]+dp[k−1])/2=c原创 2016-06-19 15:59:25 · 377 阅读 · 0 评论 -
HDU-3507-Print Article-斜率优化-DP
题目:Problem DescriptionZero has an old printer that doesn't work well sometimes. As it is antique, he still like to use it to print articles. But it is too old to work for a long time and原创 2016-06-22 00:11:51 · 343 阅读 · 0 评论 -
HDU-2829-Lawrence-dp-斜率优化
题意:一段直线上有n个点,每个点有一只价值,一条铁路的价值等于每两个点(可以直接或者间接相连,就是联通路上是否有炸弹把路给炸了)积的和;思路:斜率优化dp[i][j]为前i个点,炸j个线段能破坏的最大值没优化前的状态转移方程为dp[i][x]=max{dp[j][x-1]+sum[j]*(sum[i]-sum[j])} x-1设计算点i时,j比k的值优,dp[k][x-1]+原创 2016-06-22 23:11:45 · 419 阅读 · 0 评论 -
HDU-5773-The All-purpose Zero-最长上升子序列改写
题意:一串数求最长上升子序列(严格)其中0可以变成任意数解析:根据求最长上升子序列 的原理,每次新的数如果大于a[len],就a[len++]=x否则找到一个比x大的且最小的数,替换成x,因为是严格递增的,如果该数在序列中已经有了就不用操作。根据这个规则,对0的处理是在a[len+1]=a[len]+1 a[i]=a[i-1]+1;如果每个都要操作的话就会T,但是我们发现,这个操作其实就是原创 2016-07-29 17:37:29 · 306 阅读 · 0 评论 -
hdu-3480-Division-dp-斜率优化
题意就是:一段区间的值就是max-min的平方,求n个点分成m线段的最小值基本的DP式子是dp[i][x]=dp[j][x-1]+(a[i]-a[j+1])^2然后用斜率优化yj=dp[j][x-1]+a[j+1]^2原创 2016-06-23 17:57:47 · 278 阅读 · 0 评论 -
HDU-5763-Another Meaning-hash加DP
题目大致意思:给你一个字符串A,一个字符串B,B字符串代表有两种意思的字符串。问A可能有多少种意思思路:用hash处理一下看A中哪些位置是B字符串匹配的结尾。然后DPdp[i]=dp[i-1]+dp[i-m](i是B匹配的结尾)dp[i]=dp[i-1](不是结尾)注意当i-m#includeusing namespace std;#define nc 131#defin原创 2016-07-29 23:05:03 · 386 阅读 · 0 评论 -
HDU-5791-TWO-DP
题意:求A,B两个字符串,相同的子序列对数,位置不同,就算不同子序列DP式子看代码#include#define mod 1000000007using namespace std;long long dp[1111][1111];int a[1111];int b[1111];int n,m;int main(){ memset(dp,0,sizeof dp);原创 2016-08-03 14:04:52 · 246 阅读 · 0 评论 -
HDU-6185-Covering(广西邀请赛D题)(矩阵快速幂)
题目链接题意:4*n的矩阵中用1*2或者2*1的多米诺骨牌骨牌填充,问有多少种方案,这个n很大1e18思路:n很大肯定不能用插头dp,所以就要用正常的dp来推,再加上矩阵快速幂。这题的dp式子比较难弄,因为dp[n]和之前的所有项都有关系(包括dp[0]),具体关系就是距离n为偶数的项乘三,距离n为基数的项乘二,然后dp[n-1]和dp[n-2]要特殊处理一下。为了方便统计,所以我在矩阵里维护sum原创 2017-09-13 16:35:49 · 397 阅读 · 0 评论