![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
DP
文章平均质量分 52
yu836618672
这个作者很懒,什么都没留下…
展开
-
codeforce 11D
给定一个无向图求其环的个数。 数据较大,搜索不行,看了题解大致可以理解为状态压缩dp f[i][j]中i的二进制表示一条通路,1代表该通路上存在该点,0表示不存在,i的二进制最后一个为1的位置为该通路的起点,j为该通路的结尾。f[i][j]表示该通路有多少个。 #include #include #include using namespace std; typ原创 2013-01-12 10:26:57 · 365 阅读 · 0 评论 -
HDU 4616
多校被虐暴了 五个小时一道题没出是什么个节奏 这道题还不算很难 重点在树上任意一点开始的最长路径问题 dp[i][j][k]表示第i个节点之前有j个炸弹的最大价值 k=1是代表最优路径 k=0代表次优 同时保存是由哪个子节点转移过来的 这么在第二次搜索的时候如果最优路径正好是当前子节点转移过来的话就选择次优路径 详情就是见代码了 代码写的这叫一个丑陋啊 太尼玛伤心了 #inclu原创 2013-07-26 13:14:14 · 844 阅读 · 0 评论 -
hdu 4604
这尼玛是真坑啊 求最长递增子序列的nlogn算法需要维护一个辅助数组 我一直以为需要用二分查找维护 结果实际上只需要调用uper_bound这种函数就可以维护 ~~ 不知道从哪里弄来的题解感觉像是错的 很明显nlogn的算法保存子序列路径是非常困难的而且就算保存以后求ax的出现次数复杂度也不低啊 所以这个题解的做法我暂时还是想不明白 可能是我未知的什么算法吧 真是弱爆了 贴别人原创 2013-07-24 11:33:57 · 572 阅读 · 0 评论 -
2012 Multi-University Training Contest
HDU 4352 数位dp结合o(nlogn)的最长严格递增子序列 给定一个数的价值为 将该数字看成一个由单个数字排列成的序列,其最长严格递增子序列的长度就是该数的价值 给定一个区间 求该区间内价值为k的有多少个 nlogn的最长严格递增子序列的求法可以自行百度 #include #include #define LL __int64 int dit[50],K; LL dp原创 2013-07-20 15:41:21 · 464 阅读 · 0 评论 -
codeforce 161 D
#include #include #define max 50010 int n,k; long long dp[max][511],ans; int edge[2*max],head[2*max],next[2*max],cnt,vis[max]; void add(int v,int u) { edge[cnt]=u; next[cnt]=head[v]; hea原创 2013-04-17 11:00:47 · 484 阅读 · 0 评论 -
poj 2378
被大神说成水题的这道居然写了好久,果然是菜的不行不行了 #include #include int to[20111],head[10111],next[20111],cnt=0,n,ok[10111],flag[10111]; void add(int i,int j){to[cnt]=j;next[cnt]=head[i];head[i]=cnt++;} void dfs(int i,i原创 2013-04-11 16:47:35 · 546 阅读 · 0 评论 -
poj 3124
给一个三层的书架以及n本书 已知书的高度和宽 求书架的最小面积 状态转移十分奇葩 参考了大神的题解 dp[i][j] 表示当第二个书架的宽为i第三个宽为j的时候的最小高度和,默认第一个书架为最高的书本 首先要对书进行排序,这样使得问题简单化一点 然后对于状态转移方程见代码 #include #include #include using namespace std; #defin原创 2013-04-06 16:17:39 · 625 阅读 · 0 评论 -
hdu 4539 郑厂长系列故事——排兵布阵
#include #include #define maxn 200 int sta[maxn][2],ok[maxn][maxn]; int dp[111][maxn][maxn]; int m,n,cnt,map[111]; void prt(int i) { int t=i; while(t)printf("%d",t%2),t>>=1; puts(""); }原创 2013-04-01 16:27:31 · 643 阅读 · 0 评论 -
POJ 3280 最小回文代价
现在有一个由n个字符组成的长度为m的字符串,可以对其通过增加字符或者删除字符来使其变成回文字符串,而增加或者删除字符都有一个花费,求解使该字符串变成回文所进行操作的最小花费. 首先来说删除和添加其实是一个操作 对于字符串来说 无论是添加还是删除都不影响接下来形成回文的操作 那么cost就是添加和删除里面较小的一个 设dp[i][j]为从i 到j 的代价,状态转移就是dp[i]原创 2013-03-01 15:59:41 · 678 阅读 · 0 评论 -
codeforce 18E
#include char map[501][501]; int a[501][30][30]; int r[501][30][30]; int res1[501][30][30]; int res2[501][30][30]; int main() { int n,m; scanf("%d%d", &n,&m); for(int i=0;i<n;i++) scanf("%s",原创 2013-01-22 10:24:14 · 454 阅读 · 0 评论 -
HDU 4477
这道题是一个挺奇怪的比赛里的 意思是给一根长度为l的线 将其剪成不小于2的n段,求有多少剪法 n段长度互不相等 所以当剪成k段时需要最小长度为k*(k-1)/2; 所以k的最大值为316 dp[k][n]表示长度为n的线剪成k段的剪法 k段均大于一,则将每段的长度减1后,与dp[k][n-k]的方案数相同。 k段中有一段是1,则去掉这段长度为1的,有k-1段,且长度均大于一,与dp转载 2013-02-04 15:34:20 · 572 阅读 · 0 评论 -
COdeforce 14E
终于在没有看题解的情况下自己写出了dp题,虽然这题比较水,但还是迈出了第一步。题意大致是在一个平面坐标系,给定一系列x为1,2,3....n的点,y为1到4之间的值,求其中峰的个数为l的有几种,要求相邻两点y不能相等,有l个峰必须有l-1个谷。 鄙人方法比较笨,直接开了四维数组dp[i][j][flag][L],表示第i位为j的时候有L个峰,此时末尾为降序的话flag=1,不然等0。 状态原创 2013-01-15 10:33:30 · 550 阅读 · 0 评论 -
codeforces13C
给定一个序列,可以对其中元素进行加一或者减一的操作,问最少多少次操作可以将其转换成非降序列 数论还是弱爆了啊 根据官方题解解释,任意一个序列都存在一个最小非降序列完全由先前序列中的元素构成。 既然知道这个结论这题简单了 f[i][j]表示前i-1个元素为非降序列,第i个元素为先前序列中第j个元素做结尾形成的非降路径所需要的最小代价,由于空间限制,不能用二维数组,则对f进行简化 #in原创 2013-01-12 10:41:32 · 440 阅读 · 0 评论 -
hdu 4649 Professor Tian
又是两题的节奏 dp[i][j][2]表示第i个数的时候第j位为0或者1的期望 主要还是细心 对于每个操作进行判断 想到状态压缩这道题就不难了 #include #include #define MAXN 220 int num[MAXN]; char op[MAXN]; double p[MAXN]; int n; int len(int n) { int cnt=0;原创 2013-08-06 19:17:35 · 562 阅读 · 0 评论