摘要: 这个题目很有意思,一不小心就会让人坑在里面。题意是这样的,给你n,k,l。分别表示总共的长度,长度为5和10的车的不同颜色数量现在问你要把n的填满有多少种方案。很多人一开始都会脑子一根筋地想用排列组合去搞这个题目。然而实际上不是这样的。因为排列组合计算量巨大,而且这个题目的数据范围是10^15,绝对无法承受。其实我们可以先把n/5,这样相当于是放长度为1和长度为2的方案了。我们加入一个状态量f[i],其意义为长度为i的排列方案有多少种?那么我们可以迅速地得出这个状态转移的递推式:f[i]=k*f[i-1]+l*f[i-2]。(分别表示放长度为1和2的情况嘛)这样你是否有些眼熟了。。。。 对没有 阅读全文
posted @ 2013-11-15 21:22 092000 阅读(256) 评论(0) 推荐(0) 编辑
摘要: 题意很简单,给你一个n*m的矩阵,现在问你这个矩阵能否变为标准矩阵(即数字从小到大),如果能最少需要几步呢?其实是个赤果果的水题。记得暑假安叔也出过一个类似的题目,那个好像是在codeforces上面吧。以前我不太理解为什么是这样子做的,现在完全理解了。对于给定的矩阵,我们可以先不顾其他的,先把任意一列和任意一行放在规定的位置,然后对其他的数进行判断,如果存在不在规定位置的数字,那么这个矩阵就是不合法的;否则这个举证就是合法的。为什么这么做是对的呢?? 其实我们可以这样来理解。假设当前我们已经任意放好了一列和一行,但是还有其他的位置的数字不能对应相等,那么为了使另外的位置的数字对应相等,我们必 阅读全文
posted @ 2013-11-15 21:16 092000 阅读(387) 评论(0) 推荐(0) 编辑
摘要: 这个题目又是一个典型的dp斜率优化的题目。题意是给你n个数,你需要做的是把这个n个数分为连续的若干段,每段的权值为这段数字的和的平方加上M。求最小的总权值。我们可以根据题意写出朴素版的dp状态转移方程。然后就可以推导出使用优先队列来维护最优值。总共包括对首和队尾的两个操作。很简单,很朴素的题目,直接上代码吧。。。。就是范围定义小了,然后Wa了n^n^n^n^……发。 深坑啊。。。#include #include #include #define maxn 500500#define ll long longusing namespace std;ll f[maxn],a[maxn],sum[ 阅读全文
posted @ 2013-11-15 17:30 092000 阅读(384) 评论(0) 推荐(0) 编辑
摘要: 题目是一个很典型的斜率优化的题目。题意就不说了。是这样的,对于双端优先队列,我们共有队首和队尾两个删除操作,来保证对于任意一个i,第一个元素都是最优的。我们把dp的转移方程列出来就直达其状态为f[i]=min(f[j]+(a[i]-a[j+1])^2+m)。所以我们如果有j1=f[j2]-f[j1]+a[j2+1]-a[j1+1]。同时由于等式两边都是正数而且随着i的增大,a[i]也是变大的,所以只要等式一旦成立,那么对于后面的每一个a[i],都是成立的,所以此时说明j1这个元素已经没有用了,因为它一定不会是后面的最优解。所以可以从对首删除,这样我们就完成了对首的操作。接下来稍微难一点的是队尾 阅读全文
posted @ 2013-11-15 17:25 092000 阅读(444) 评论(0) 推荐(0) 编辑