
dp
limboman
这个作者很懒,什么都没留下…
展开
-
hdu5760
区间Dp,经典问题最长上升公共子序列的变式; 计数需要去重,思想在于对于本质相同的序列均将其表示到最大的哪个; 然后dp时依据包含关系就可以去重啦;#include<cstdio>#include<algorithm>#include<cstring>#define rep(i,k,n) for(int i=k;i<=n;i++)#define rep2(i,k,n) for(int i原创 2016-11-17 09:08:13 · 295 阅读 · 0 评论 -
4521: [Cqoi2016]手机号码
比较基本的数位DP,限制都较为简单;#include<bits/stdc++.h>#define rep(i,k,n) for(int i=k;i<=n;i++)#define rep2(i,k,n) for(int i=k;i>=n;i--)using namespace std;typedef long long ll;const int N=13;void upd(ll& x,ll原创 2017-01-06 09:43:55 · 407 阅读 · 0 评论 -
51nod算法马拉松20
先写一下做出的题吧(感觉自己好弱。。。。。) A: 拆分贡献,组合数搞一搞;#include<bits/stdc++.h>#define rep(i,k,n) for(int i=k;i<=n;i++)#define rep2(i,k,n) for(int i=k;i>=n;i--)using namespace std;typedef long long ll;const int N原创 2016-11-28 00:06:53 · 399 阅读 · 0 评论 -
bzoj4572: [Scoi2016]围棋
这道题我只会子集和变换优化的sb暴力(什么轮廓线插头都忘光了…) 考虑到合法状态的稀疏性(其实是你自己不会证明吧……),就可以放心暴力啦;#include<bits/stdc++.h>#define rep(i,k,n) for(int i=k;i<=n;i++)using namespace std;const int mod=1e9+7;const int N=5e4+7;const原创 2016-12-07 15:23:25 · 709 阅读 · 0 评论 -
sd省队集训二轮tree
感觉这题应该跟hdu5290很像,结果它们果然系出同源; 这个题应该处于更根源的位置; 根据算法3的思想,令dp[i][j][k]表示以i为根的子树且已经使用了j个黑点,最深未被覆盖的长度或者沿着根最多能覆盖多少长度。 但是这样状态会很多无法存下。 考虑将k表示成还拥有一个黑点k,使得点i为根的子树全被保护。 令T[i]表示[i不是黑点] 枚举k,当点u枚举到一个儿子v原创 2016-11-14 18:04:30 · 463 阅读 · 1 评论 -
bzoj3174 [Tjoi2013]拯救小矮人
首先,我们要证明一定存在一个最优逃生序列ai满足: Aa*i + *Bai <= Aai+1 + Bai+1; 可采用反证法得知对于所有逃生序列ai,交换满足存在: Aa*i + *Bai > Aai+1 + Bai+1 的数对一定不会更差,从而得证; 这样就为我们提供了一个序,然后就可以dp啦#include<bits/stdc++.h>#define rep(i,k原创 2016-10-01 16:32:48 · 291 阅读 · 0 评论 -
4361: isn
#include<bits/stdc++.h>#define rep(i,k,n) for(int i=k;i<=n;i++)#define rep2(i,k,n) for(int i=k;i>=n;i--)using namespace std;const int N=2017;const int mod=1e9+7;int a[N],n,b[N],c[N],top=0,bin[N],原创 2016-10-21 20:38:50 · 302 阅读 · 0 评论 -
4513: [Sdoi2016]储能表
省选被这题虐。。。前段时间推了一晚上终于推出dp式子; 正解是去发现神奇性质,然而数位dp也可以过;#include<bits/stdc++.h>#define rep(i,k,n) for(int i=k;i<=n;i++)#define rep2(i,k,n) for(int i=k;i>=n;i--)using namespace std;const int N=105;typed原创 2016-10-21 20:46:22 · 461 阅读 · 0 评论 -
3072: [Pa2012]Two Cakes
有dp[i][j]=min(d[i-1][j],d[i][j-1])+1 –> a[i]==b[j] dp[i][j]=d[i-t+1][j-t+1]+t —> t为i,j向前最长的不同序列; 但真正需要记录的状态为O(n);#include<bits/stdc++.h>#define rep(i,k,n) for(int i=k;i<=n;i++)using namespace std;原创 2016-10-21 21:16:01 · 379 阅读 · 0 评论 -
3462: DZY Loves Math II
一开始看到这题忽视了S以及问题的特殊性;从而想到了奇怪的方向 注意到构成元素均为S的约数,所以划分n的方案可以分成若干S的和与零散部分; 其中零散部分必不能再拆出S,否则会重复计算; 如此,使用组合数与多重背包即可;#include<bits/stdc++.h>#define rep(i,k,n) for(int i=k;i<=n;i++)#define rep2(i,k,n) for(i原创 2016-10-22 20:46:15 · 368 阅读 · 0 评论 -
hdu5290
tree dp; 考虑祖先对孩子的影响: 有g(i,j)表示 i 这个节点获得先祖的 j 深度的赏赐覆盖全部子树的最小代价 考虑孩子对祖先兄弟等的影响: 有f(i,j)表示 i 这个节点覆盖了全部子树且向外延伸j的最小代价 转移显然;#include<cstdio>#include<algorithm>#include<cstring>#define rep(i,k,n) for(i原创 2016-11-13 11:33:16 · 343 阅读 · 0 评论