动态规划(DP)似乎占据了大部分的编程竞赛题目,乃至三分之一。当然,DP也不是一个学一次就Ok的单一算法。
这还取决于你是否把数据结构与算法放在同一个等级中考虑。如果你想要在编程竞赛中一展风采的话,当然,有些数据结构是你应该熟悉的。其中最重要的有范围树(Range Tree,也被称为线段树或区间树)和树状数组(BITs),也被称作Fenwick树。除此之外,许多DP算法使用了一个前缀和数组(prefix sum array)。
能想到的最精华的单一算法如下所列,排名不分先后。绝大多数非动态规划问题似乎都...
分类:
编程语言 时间:
2014-10-22 15:56:48
阅读次数:
208
先预处理出能到当前点的区间,然后通过前缀和求得当前值即可。#include #include #include #include #include #include #include #include #include #include using namespace std; #define MP...
分类:
其他好文 时间:
2014-10-21 23:06:45
阅读次数:
274
next数组表示的是,最长前缀和后缀相等的长度。
#include
#include
#include
#include
using namespace std;
const int N=1000000;
int next[N];
char s[N],t[N];
/*********KMP小结**********/
//求next数组
void getNext(int lt)
{
...
分类:
其他好文 时间:
2014-10-20 23:26:53
阅读次数:
294
题意:给定n个楼层,初始在a层,b层不可停留,每次选一个楼层x,当|x-now| b时, 那么dp[i][j] += dp[i-1][(j与b的中点(以下))~n]由于dp[i][j]的值只跟dp[i-1][]的一些值有关,所以用滚动数组会大大减小内存。用一个sum[i][j]维护前缀和即可。代码:...
分类:
其他好文 时间:
2014-10-20 11:32:25
阅读次数:
147
题目链接:点击打开链接
题意:
给定 n a b k
构造一个长度为k的序列。
使得序列中 对于任意两个相邻的数 | w[i-1] - w[i] |
且第一个数 |a - w[1] |
问:
有多少种不同的序列。
思路:dp
对于粗暴的dp复杂度是 n^3
我们可以用前缀和来优化掉一维的dp。。
反正是简单粗暴的题。具体看代码吧。。
#include
...
分类:
其他好文 时间:
2014-10-19 23:19:10
阅读次数:
179
题意:求长度为i(2<=i<=N)的前缀,若前缀是一个周期串,则输出长度i和它的最大周期;要找出所有满足条件的。
思路:next[i]数组里面存的是i位置前 字符串的相同前缀和后缀的最大长度,若它是一个周期串,那它必满足i%(i-next[i])==0....
分类:
其他好文 时间:
2014-10-19 14:22:14
阅读次数:
215
很简单的递推题。d[n]=d[n-1]+d[n-k]注意每次输入a和b时,如果每次都累加,就做了很多重复性工作,会超时。所以用预处理前缀和来解决重复累加问题。最后一个细节坑了我多次:printf("%I64d\n",(s[b]-s[a-1]+mod)%mod);这句话中加mod万万不能少,因为理论上...
分类:
其他好文 时间:
2014-10-16 04:54:52
阅读次数:
168
二分+前缀和法
满足条件的子序列长度在(0,n)之间,sum[x+i]-sum[i]为从从第i个元素开始序列长度为x的元素的和。前缀和可在O(n)的时间内统计
sum[i]的值。再用二分找出满足条件的最小的子序列长度。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#inclu...
分类:
其他好文 时间:
2014-10-15 00:09:19
阅读次数:
251
https://vijos.org/p/1750是不是我想复杂了。。。。自己yy了个二维线段树,然后愉快的敲打。但是wa了两法。。。。。。。sad原因是在处理第二维的更新出现了个小问题,sad。void pushup1(int x) { for1(i, 1, mm#include #include ...
分类:
其他好文 时间:
2014-10-14 21:15:47
阅读次数:
267
题解:前缀和计算统计。#include #include using namespace std;typedef long long LL;LL ans; char s[100010];int T,k,t[200],i,j,n;int main(){ scanf("%d",&T); wh...
分类:
其他好文 时间:
2014-10-14 17:17:19
阅读次数:
119