摘要:
这道题目的关键就是想到用树状数组对DP进行优化,首先令f(i)表示分到第i个的时候子段和大于等于0的时候出现的最大的种树, 那么可以发现f(i)=∑f(j)|sum(i)−sum(j)≥0那么后面的部分可以变成sum(i)≥sum(j)那么就可以使用树状数组进行维护,下标就是sum... 阅读全文
摘要:
这道道题目就是个动态规划另f(i)表示在i的位置上的时候的最大值那么f(i)=sum(i)+max{f(j)−sum(j+1)}那么发现如果j超出i-k-1的范围就没有意义了,用单调队列优化一下就好了#include #include #include #include #incl... 阅读全文
摘要:
实际上就是另f(S,i)表示在集合S中的所有面积的巧克力能不能被组成一个长高为i的大的巧克力,那么显然 长宽是可以交换的那么只考虑高小于宽的情况就行了。那么f(S,i)=f(S−S0,min{i,Sum[S−S0]/i})同时f(S0,min{i,Sum[S0]/i})因为高相同所... 阅读全文
摘要:
这道题目用DP来搞首先题目可以看成把所有的计算机分成很多组每一组的都关闭同一种服务,同时这一组的关闭能够关闭所有的计算机,那么另S为当前的所有计算机的集合另S0为S的子集另全集(所有计算机)为S′那么可以很容易的发现f(S)=max{f(S0)+(S′==cover(S0))}其中... 阅读全文
摘要:
这倒题太坑了。。。简直。。。明明没有错误的代码就是A不了。。 题目分析另f(state,i,j) 表示在状态为state的情况下当前在i点前一个点是j点的所能够得到的最大的乘积那么很容易发现f(state+(1#include using namespace std;/******... 阅读全文
摘要:
首先可以发现肯定这个图是一个森林,而且在这个森林之中只有一个环,那么只要找到这个环上的任意一条边(删掉这条边)然后对这条边的两个端点分别作两次最大独立集,然后分别取两个点中不取的情况的最大值,然后这个值就是要找的了,因为只有一个环,所以我找环的方法是用并查集的方法。。#includ... 阅读全文
摘要:
首先很容易可以得到另f(i,j)表示第i盏灯的父亲是否点亮所以j=0|1如果父亲放了,那么自己放或者不放都可以那么f(i,j)=max{∑f(ison,0)∑f(ison,1)},如果父亲没有放置,那么自己必须放那么f(i,0)=∑f(ison,1)但是这个时候要让被灯照亮两次的边... 阅读全文
摘要:
这道题代码很短,实际上就是令dp(i)表示是否可以组成i这么大的面值然后sum(i)表示当前组成i这么大的数字用了多少个当前的数字,然后循环的时候维护sum的值不超过可用范围就行了#include #include #include using namespace std;cons... 阅读全文
摘要:
分析一下发现如果每一次放进去一个新,它就会对所有覆盖这个点的所有颜色的L加1那么另add(i,j)为第一个放到i第二个放到j放完之后这种状态有多少组交叉那么有int add(int x, int y) { int cnt = 0; for(int i=0;i x && ... 阅读全文
摘要:
其实就是把每一部分的内容缩成一个点,然后把每一个特殊意义的符号用方便表示的符号表示出来 比如 (@表示必须选一个, #表示选择1个或者不选,的含义和*一样) ! -> @@# * -> ? -> @## 然后if(check(str[0][i][0]) |... 阅读全文