题目链接:900 E. Maximum Questions 题意: 给出一个长度为n只含有a和b还有'?'的串s,且'?'可以被任意替换为a或b.再给出一个字符串t (奇数位上为a,偶数位上为b,所以在题目中只给出了t的长度m),现在要求保证t在s中出现的次数最多的情况下面,使用'?'最小的情况使用了几个问号. 题解: 拿到这个题目可以看出是DP,但是比较难以解决的就是如何确定在第i个位置时前面m个字符能够满足t,这里我看了别人的题解 -.-哇,震惊!首先的话先对'?'做前缀和,然后设置两个数组…
. 二进制状态压缩动态规划 对于某些情况,如果题目中所给的限制数目比较小,我们可以尝试状态压缩动态规划.例如,题目中给出数据范围\(n<=20\),这个一般情况下是一个状压DP的提示. 状态压缩,顾名思义,要把每种状态压缩起来.一个经典的问题是洛谷P1171,也就是著名的货郎担问题,它是一个NPC难题,目前不存在多项式算法.当题目中\(n\)的范围比较小时,我们可以考虑使用状态压缩动态规划(状压DP)来解决.(注:本文出现的"状压DP"若无特殊说明,均指状态压缩动态规划) 我们用…
[BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆) 题面 一棵二叉树的所有点的点权都是给定的集合中的一个数. 让你求出1到m中所有权值为i的二叉树的个数. 两棵树不同当且仅当树的形态不一样或者是树的某个点的点权不一样 分析 设\(c(i)\)表示数值i是否在集合中.\(f(i)\)表示权值为i的二叉树的个数.那么 \[f(n)=\sum_{i=1}^n c(i) \sum_{j=0}^{n-i} f(j)f(n-i-j)\] 其…
大意:给定长$n$的字符串$s$, 只含'a','b','?', '?'可以替换为任意字符, 在给定长$t$的字符串, "ababab...", 求替换尽量少的'?', 使得$s$能匹配最多的不相交的$t$. 先不考虑最少替换的限制, 要尽量多的匹配$t$, 可以先预处理出可以匹配的位置, 然后$dp$. 要求最小的话, 每次$dp$转移时可能有多个转移点, 对每个dp值维护一个前缀最小值即可. #include <iostream> #include <iostre…
https://codeforces.com/problemset/problem/813/D dp[i][j] = 一条链以i结尾, 另一条链以j结尾的最大值 关键要保证转移时两条链不能相交 #include <iostream>#include <cstdio> #define REP(i,a,n) for(int i=a;i<=n;++i) using namespace std; , M = 1e7+; int n; int a[N], dp[N][N], x[M],…
题目链接:http://codeforces.com/problemset/problem/702/A 题意: 给你N个数,a[0], a[1], a[2], ....., a[n-1],让你找出最长的连续上升子序列中元素的个数. 思路: 设dp[i]代表以a[i]结尾的连续上升子序列中元素的个数,那么dp[i] = (a[i] > a[i - 1] ? dp[i - 1] + 1 : 1),含义是如果a[i]比a[i-1]大,那么a[i]可以加入到以a[i-1]为尾的最长连续上升子序列末尾,取…
题目链接:http://codeforces.com/contest/762/problem/D 多多分析状态:这个很明了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define ls i<<1 #define rs ls | 1 #define mid ((ll+rr)>>1) #define…
题目链接: http://codeforces.com/contest/889/problem/C 题意: 给你 \(n\)和 \(k\). 让你找一种全排列长度为\(n\)的 \(p\),满足存在下标 \(i\),\(p_i\)大于所有 \(p_j\),\(j\epsilon[1,i-1]\)同时大于所有\(p_i\),\(j\epsilon[i+1,i+k]\).问你满足这样条件的排列有多少种? 题解: 设\(dp[i]\)表示以 \(i\) 结尾的,满足题目要求的\(1\) ~ \(i\)…
题目链接:http://codeforces.com/problemset/problem/762/D 题意:给出一个3*n的矩阵然后问从左上角到右下角最大权值是多少,而且每一个点可以走上下左右,但是一个点 不能被经过两次及以上. 题解:一看感觉是一道插头dp但是,由于只是3 * n的矩阵,所以必定有规律.然而规律也挺好找的.只要往回走必定会取完3行. 而且走法都有规律的最好自行画图理解一下. #include <iostream> #include <cstring> #defi…
Spiral Maximum 题目连接: http://codeforces.com/problemset/problem/173/C Description Let's consider a k × k square, divided into unit squares. Please note that k ≥ 3 and is odd. We'll paint squares starting from the upper left square in the following orde…