![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
dp
After0514
这个作者很懒,什么都没留下…
展开
-
Codeforces 268D
有一根柱子,每个点上可以插有且仅有一根棍子,棍子的方向有四种。 初始,可以选择任意方向往上爬,然后就只能按照原来的方向不停的往上爬。。。 dp[i][a1][a2][a3][a4]表示当前已经插前i跟棍子,第i跟棍子能否到达a1,其他三个方向的棍子与第i跟棍子的距离分别为a2,a3,a4#include<cstdio>#include<iostream>#include<cstring>u原创 2016-12-25 17:33:06 · 363 阅读 · 0 评论 -
Codeforces 513E1
只会K子段最大权值和,对于这道题。。。思路代码都是抄的。。。 题解大概是说 ∑|si−si+1|=>∑si−si+1||∑−si+si+1然后两种情况取个最大值\begin{equation}\sum|s_i-s_{i+1}| =>\sum s_i-s_{i+1} | |\sum -s_i+s_{i+1}\\然后两种情况取个最大值\end{equation}#include <bit原创 2016-12-22 22:30:05 · 193 阅读 · 0 评论 -
Codoforces 29E
⎧⎩⎨⎪⎪dp[x][y][0]dp[x][y][1]dp[n][1][0]=0表示A在x,B在y的最短路表示A在y,B在x的最短路\begin{equation*}\left\{\begin{array}{}dp[x][y][0] & 表示A在x,B在y的最短路\\dp[x][y][1] & 表示A在y,B在x的最短路\\dp[n][1][0]=0\end{array}\right.原创 2016-12-22 17:20:14 · 157 阅读 · 0 评论 -
Codeforces 662C
f[i][j]表示翻转行状态为j得到包含i个1的列的个数#include<cstdio>#include<algorithm>#define N 21using namespace std;int f[N][1<<N],n,m,ans=1e9;char s[N][1000010];int main(){ scanf("%d%d",&n,&m); for(int i=1;原创 2016-12-08 11:09:33 · 561 阅读 · 0 评论 -
Codeforces 367E
dp[i][j][k]表示前i个数,出现j个左边界k个右边界情况总数 1.左边界2.右边界3.左边界和右边界4.什么都不是\begin{array}{}1. 左边界\\2. 右边界\\3. 左边界和右边界\\4. 什么都不是\\\end{array}#include<cstdio>#include<iostream>#include<cstring>using namespace原创 2016-12-06 15:58:01 · 220 阅读 · 0 评论 -
Codeforces 703E
num[i][j],sum[i][j],前i个数合成k的第j的因子至少需要个数以及最小和#include<iostream>#include<cstring>#include<cstdio>using namespace std;typedef __int64 LL;const LL INF=1e17;const int N=1000;LL aa[N],cc[N],bb[N+10000原创 2016-12-08 10:59:51 · 297 阅读 · 0 评论 -
Codeforces 49E
dp[i][j][c],dp1[i][j][c]子串[l,r]能否完全变成c vv1[l][c],vv2[l][c]从l开始的能完全变成c的所有r ans[i][j],ss串的前i个字母和tt串的前j个字母的最短祖先#include<cstdio>#include<iostream>#include<vector>#include<cstring>using namespace std;原创 2016-12-08 10:19:26 · 312 阅读 · 0 评论 -
Codeforces 28D
l+r+c 相同的列车才能一起 mp[i][j] 表示l+r+c=i && l=j的最大权的位置#include<cstdio>#include<iostream>#include<algorithm>#include<map>using namespace std;const int N=1e5+100;struct P{ int v,c,l,r,s;}p[N];int原创 2016-12-08 10:07:54 · 204 阅读 · 0 评论 -
Codeforces 86C
自动机+dp dp[i][j][k]在i节点字符串长度为j最小的未匹配位置k/////f[u]=r,r������u�ĺ���/////last[u]=r,r������u�ĺ��У�������һ������////ÿ����һ����ĸ��״̬ת��һ��#include<cstdio>#include<iostream>#include<queue>#include<cstr原创 2016-12-08 09:53:15 · 22396 阅读 · 0 评论 -
Codeforces 101D
树形dp,关于sort那里, 假如u的两个子树v1,v2相继访问,那么优先访问谁 假如此时已经过去时间t,假如先访问v1: dp[v]访问v树的最优花费,son[v]v树的节点个数,sumv*2 fv1=(t+(u,v1))*son[v1]+dp[v1] fv2=(t+sum[v1]+(u,v2))*son[v2]+dp[v2];假如先访问v2: f1v2=(t+(u,v2))*son[原创 2016-12-06 15:09:51 · 236 阅读 · 0 评论 -
Codeforces 71E
dp[i] 表示状态i最多能合成前dp[i]所需要的元素#include<cstdio>#include<iostream>#include<cstring>using namespace std;int n,k,s1,s2;string s[100]={"H","He","Li","Be","B","C","N","O","F","Ne","Na","Mg","Al","Si","P"原创 2016-12-22 22:40:50 · 291 阅读 · 0 评论 -
Codeforces 407D
最大子矩阵问题#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#define N 402using namespace std;short p[N][N*N];int a[N][N],n,m,l,r,j,i,d[N][N],f[N][N],ans;int main(){ scanf("%原创 2016-12-22 23:47:23 · 383 阅读 · 0 评论 -
Codeforces 500F
1.分段搞一下就好了 2.CDQ应该也可以过吧,懒得写了#include <algorithm>#include <cstring>#include <cstdlib>#include <cstdio>#define N 4010#define For(i,x,y) for (i=x;i<=y;i++)using namespace std;struct ww { int c原创 2016-12-23 09:46:45 · 322 阅读 · 0 评论 -
Codeforces 316D2
有n个人,第i个人初始拥有第i号球, 两两之间可以交换球, 第一种人最多能交换1次 第二种人最多能交换2次, dp[i][j]表示第一种人i个,第二种人j个的情况总数 不妨设第一种人1~i,第二种人i+1~i+j,我们只关注第一个人手中的球 1.手中的球为1 dp[i-1][j] 2.手中的球为i+1~i+j j*dp[i][j-1] 3.手中的球为2~i 枚举这个球在传递过程中原创 2016-12-25 17:17:36 · 232 阅读 · 0 评论 -
Codeforces 120I
从后往前枚举新串与原串第一个大的位置, 然后后面的就可以随便选了,然后我们贪心保存后面能得到的最大值,直到最大值大于原串, 然后递归回去求字典序最小#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int N=2e5+100;int cc[10]={119,36,93,109,46,原创 2016-12-25 11:23:29 · 212 阅读 · 0 评论 -
Codeforces 204D
dp[i]表示前i个字母里面一定有连续k个’B’的情况总数 dp1[i]表示前i个字母里面只有第i号位置出现有连续k个’B’情况总数 然后答案的话就是直接枚举第一次出现连续k个’B’的位置, 然后情况总数*后面一定出现连续k个’W’情况总数#include<cstdio>#include<iostream>#include<cstring>using namespace std;con原创 2016-12-24 21:32:06 · 250 阅读 · 0 评论 -
Codeforces 433E
自动机上的数位dp dp[i][j][k] 表示将要考虑到第i个位置,目前走到自动机第j号节点,目前总的价值k,的情况总数////HDU 2457/////f[u]=r,r������u�ĺ���/////last[u]=r,r������u�ĺ��У�������һ������////ÿ����һ����ĸ��״̬ת��һ��#include<cstdio>#include<ios原创 2016-12-24 10:56:54 · 1741 阅读 · 0 评论 -
CodeForces 643E
http://bak.vjudge.net/problem/379403/origin#include#include#include#include#include#include#includeusing namespace std;const int N=5e5+100;int du[N];double dp[N][110];int T=60;int pre[N原创 2016-10-25 21:27:03 · 281 阅读 · 0 评论 -
CodeForces 68D
map瞎怼 map保存子树权值和 dfs的时候直接贪心就好了 add o(30lg) decay o(30lg)#include<cstdio>#include<iostream>#include<cstring>#include<map>using namespace std;map<int,int> mp;int mi[33];int h,q;double ans=0;v原创 2016-11-14 16:42:13 · 306 阅读 · 0 评论 -
Codeforces 76B
每只老鼠都最多有两个选择,每只老鼠的选择互不交叉,直接dp 1.dp[i][0] 老鼠i朝,离他最近的靠左的ch走 2.dp[i][1] 朝靠右的走#include<cstdio>#include<iostream>#include<cstring>#include<cmath>using namespace std;const int N=1e5+100;int mi[N],ch[原创 2016-12-23 11:06:57 · 219 阅读 · 0 评论 -
Codeforces 15D
1.预处理以(i,j)为左上角的子矩阵的代价 2.然后优先队列+暴力修改#include<iostream>#include<cmath>#include<cstdio>#include<cstring>#include<queue>using namespace std;const int maxn = 1000+10;int val[maxn][maxn];int M,N;t原创 2016-12-23 10:37:30 · 224 阅读 · 0 评论 -
Codeforces 433E
自动机+数位dp////HDU 2457/////f[u]=r,r������u�ĺ���/////last[u]=r,r������u�ĺ��У�������һ������////ÿ����һ����ĸ��״̬ת��һ��#include<cstdio>#include<iostream>#include<queue>#include<cstring>using namespa原创 2016-12-06 13:50:09 · 20200 阅读 · 0 评论 -
Codeforces 477D
⎧⎩⎨⎪⎪big[i][j]表示子串子串[i,j]是否大于子串[i−j,j]getcnt()计数getmm()求最小值\begin{equation}\left\{\begin{array}{}big[i][j] 表示子串子串[i,j]是否大于子串[i-j,j]\\getcnt()计数\\getmm()求最小值\\\end{array}\right.\end{equation}#in原创 2016-12-06 12:20:15 · 202 阅读 · 0 评论 -
Codeforces 67C
经典的dp#include <cstdio>#include <cstring>#include<iostream>using namespace std;#define inf 10000000#define N 4005#define get_min(a,b) {a=min(a,b);}int dp[N][N], t1, t2, t3, t4;int p1[N][30], p2[原创 2016-12-05 21:50:43 · 378 阅读 · 0 评论 -
CodeForces 331C3
数位dp dp[len][a][b][c] 长度为len第一个数字为b,最后为数字为c,中间全部为0的十进制数,前缀最大数字为a,消减为 长度为len最后为数字为c1#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int N=11;typedef __int64 LL;LL dp原创 2016-11-16 23:24:19 · 394 阅读 · 0 评论 -
CodeForces 39C
暴力区间dp 某n2n^2姿势一直没学会#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<vector>using namespace std;const int u=4010;struct rec{int x,l,r;}a[u];int f[u][u],d[u][u],v[原创 2016-11-29 15:20:20 · 296 阅读 · 0 评论 -
Subarray Cuts
带绝对值的k元组求和最大值问题#include using namespace std;const int inf = 1000000007;int dp[405][55][2];int n , k , a[405];inline int sum (int l , int r) { return a[r] - a[l - 1];}int main () { #原创 2016-10-31 11:54:03 · 357 阅读 · 0 评论 -
CodeForces 643E
一棵有根树,每条边都有0.5个概率消失, 问根能到达的最深深度值的期望, 定义:dp[i][j]为以i为跟深度<=j的概率,#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int N=5e5+100;int pre[N];double dp[N][66];int main(){原创 2016-11-09 15:31:02 · 206 阅读 · 0 评论 -
CodeForces 596E
每个位置都有一个字母,沿着一条路,路上的字母可以要或者不要,可以得到一个字符串 问题是给定字符串,判断是否存在一条路径可以得到这个字符串#include<cstdio>#include<iostream>#include<cstring>using namespace std;const int N=210;const int NN=1e6+10;char ss[N][N];char原创 2016-11-09 12:51:12 · 277 阅读 · 0 评论 -
CodeForces 37d
一排有m个房子从1到m,每个房子现在有xi人,每个房子最多能做小yi个人, 现在所有人开始移动,每个人只能向后面的房子移动, 问有多少种方案#include<cstdio>#include<iostream>#include<cstring>using namespace std;const int N=1100;const int mod=1e9+7;const int INF=0原创 2016-11-09 00:07:55 · 297 阅读 · 0 评论 -
codeforces 724G
异或运算求权值和#include#include#include#include#include#include#includeusing namespace std;const int N=1e6+10;const int M=2e6+10;const int mod=1e9+7;typedef __int64 LL;struct Edge { int原创 2016-10-26 17:22:51 · 366 阅读 · 0 评论 -
HDU Disney's FastPass
原创:http://acm.hdu.edu.cn/showproblem.php?pid=4114题意:从1开始遍历完k个给定点,最终回到1,的最少时间思路:首先是floyd预处理出任意两点之间的最短距离。dp[state1][state2][u]表示在该状态state1(已经访问过的景点)、state2(手中有的景点的票)、目前所在的位置时所花费的时间的最小值,于是答案就是dp[(1转载 2015-03-17 17:21:20 · 436 阅读 · 0 评论 -
WuKong-HDU2833
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2833题意:给定无向图,求两条最短路A->B,C->D,问这两条最短路的公共点最多有多少个思路:1:floyd预处理所有点对最短路: 2:记忆化搜索:首先A->B的最短路径,可以形成一棵有根树,沿着A->B的最短路径形成的树,从A开始搜索,dp[u],表示从u->B原创 2015-03-20 17:09:28 · 383 阅读 · 0 评论 -
CodeForces 605E
[http://blog.csdn.net/u013654696/article/details/51932347]最短路#include<cstdio>#include<iostream>#include<cstring>#include<cmath>using namespace std;const int N=1100;const double INF=1e20;const dou原创 2016-11-16 11:22:57 · 285 阅读 · 0 评论 -
CodeForces 150D
区间dpgg[i][j]表示区间[i,j]全部消除的最大权dp[i][j][k]表示区间[i,j]最后剩余一个长度为k的回文串其余全部消除的最大权#include<cstdio>#include<iostream>#include<cstring>using namespace std;const int N=155;int gg[N][N];int dp[N][N][N];int原创 2016-11-14 08:48:37 · 329 阅读 · 0 评论 -
CodeForces 212C
dp dp[i][0]表示第i号位置没有变动,dp[i][i]表示变动#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int N=220;char ss[N];typedef __int64 LL;LL dp[N][2];LL cal(int a,int b){ int原创 2016-11-17 11:46:09 · 309 阅读 · 0 评论 -
Codeforces 599E
dp[i][j]以i为根,包含点集j的情况总数sum[i][j]以i为根,包含点集j并且根节点只有一个分支的情况总数\begin{equation}dp[i][j]以i为根,包含点集j的情况总数\\sum[i][j]以i为根,包含点集j并且根节点只有一个分支的情况总数\\\end{equation}#include<cstdio>#include<iostream>#include<cst原创 2016-12-05 20:56:18 · 938 阅读 · 0 评论 -
Codeforces 15E
dp[n]表示总共有2*n层的只考虑左边路径总数 然后单边情况下, d[n]只考虑水平方向那个3*n的奇怪东西的路径总数#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int N=1e6+10;typedef __int64 LL;const int mod=1e9+9;LL原创 2016-12-05 20:14:45 · 221 阅读 · 0 评论 -
Codeforces 285E
dp[i][j][k]前i个数字有j个好位置处于第k种情况⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪1.a[i]=i2.a[i−1]=i,a[i]=i−13.a[i−1]≠i,a[i]=i−14.a[i−1]=i,a[i]≠i−15.a[i−1]≠i,a[i]≠i−1\begin{equation*}dp[i][j][k]\\前i个数字有j个好位置处于第k种情况\\\left\{\begin{a原创 2016-12-05 17:09:11 · 355 阅读 · 0 评论 -
CodeForces 273D
dp[n][l][r][2][2]表示图形覆盖了n行最后一行的左端点为l,右端点为r,左右端点的允许扩展情况第一个2表示左端点的状态={1,可以左移右移0,只能右移第二个2表示右端点的状态={1,可以左移右移0,只能左移\begin{equation*}dp[n][l][r][2][2]表示图形覆盖了n行最后一行的\\左端点为l,右端点为r,左右端点的允许扩展情况\\第一个2表示左端点的状态=原创 2016-11-20 16:00:10 · 314 阅读 · 0 评论