摘要:递推+容斥原理这个题做的晕的不行,实在是糟,等回头什么时候在做一次吧。。。 1 #include 2 #include 3 using namespace std; 4 int c[5],d[5]; 5 long long f[100005]; 6 int main() 7 { 8 fo...
阅读全文
摘要:好像带点博弈,又好像没有。 设dp[i][j] 为[i,j]区间内先手得分的最大值(这里的先手不一定是指player A!) 这时候只需要枚举出现在的先手会取哪一边,取几个,然后现在的最优状态就可以由以前的状态推出来 那么dp[i][j] = sum[i,j]-min(dp[i+...
阅读全文
摘要:1. POJ3254Corn Fields 设dp[i][j] 表示第i行状态为j的合法方案的个数 dp[i][j] = dp[i][j] + dp[i-1][k] 当然状态方程很好写,重点在与怎么判断是否是合法的方案,鉴于这题比较简单就不细说 (1)当前行内,不能有相邻的两个1 (...
阅读全文
摘要:TYVJ1125 JR's chop http://www.tyvj.cn/Problem_Show.aspx?id=1125 先将每根筷子按长度排序 设dp[i][j][0]为前i个筷子取j对且不取第i个的最小解 dp[i][j][1]为前i个筷子取j对且取第i个的最小解 d...
阅读全文
摘要:http://www.tyvj.cn/Problem_Show.aspx?id=1124 设状态dp[i][j] 为第i个花放入第j个瓶子里所能得到的最大价值 且 (i 2 #include 3 #include 4 #include 5 #include 6 #include 7...
阅读全文
摘要:很好也很烦的一个树形DP,昨天搞了一晚上是在想不出,后来没办法去看题解了,完事发现非常令人感动的是,我一开始设的状态都错了,然后就一直错了下去,还好及时的回头是岸了。 不说废话了,正题: 题目大意:给一棵树,n个节点,每个节点有一个权值,要求从节点1出发最多走k步,求所经过的点的权值和的最大...
阅读全文
摘要:和普通的完全背包不同的地方时多了物品选取的限制,因此需要增加一维dp[i][j][k]表示前i种物品,选取j个放入容量为k的背包中所能得到的最大价值这里和一维的背包一样可以利用滚动数组省略一维即dp[i][j] 表示前选取i个放入容量为j的背包所能得到的最大价值dp[i,j] = max(dp[i,...
阅读全文
摘要:最长不降子序列,O(n^2)算法能超时超到明年需要o(nlogn)算法(CMI)这个问题利用到了辅助数组d[i],这里姑且称它为栈,因为对该数组的操作像是栈的操作,d[i]表示长度为i的不降子序列中最小的最后元素,最后栈的长度就是最长不降子序列的长度当循环到a[i]的时候和栈顶元素s比较,如果sa[...
阅读全文
摘要:这个题也不错。。设dp[i][j](j 2 #include 3 #include 4 #include 5 using namespace std; 6 7 const int maxn = 1001; 8 int a[maxn],dp[maxn][maxn]; 9 int main()...
阅读全文
摘要:水题裸数字三角形,稍微升级从下游往上推设dp[i][j]表示到达(i,j)时所能得到的最大分数目标dp[1][j]中的最大值方程:dp[i][j] = a[i][j]+max(dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1])特殊情况加特判即可 1 #include 2 #...
阅读全文
摘要:这个题不错。一开始以为N个石头都必须用上,就是恰好装满的01背包,后来敲之,发现不对,原来可以不用都用,然后就一直往背包这方面想,可是怎么也想不出,后来看了题解,题解上说可以怎样怎样然后用背包,看老半天都不知道在说啥,后来看另一篇,说这个是差值DP,一听名字好神奇,然后看完+理解。设dp[i,j]表...
阅读全文
摘要:裸分组背包v[i][j]第i组第j个的价值w[i][j]第i组第j个的费用(其实w[i][j]=j)dp[i][j]把前i组放包里能获得的最大价值dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i][k]]+v[i][k])用一维的话就是dp[j]=max(dp[j],dp[...
阅读全文
摘要:有关DP的斜率优化,一篇感觉不错的文章http://blog.csdn.net/iaccepted/article/details/6699691
阅读全文
摘要:多重背包+二进制优化这是怎么了,连做俩题都是这东西,不多说了,TYVJ1194唯一的特点是当mi等于-1时,就 mi=g/gi;剩下的就是普通的多重背包二进制优化了。 1 #include 2 #include 3 #include 4 #include 5 using namespace ...
阅读全文
摘要:巨坑。。。和数字三角形原理差不多,就是状态多一点,而且前后状态有影响坑1:在第i行,从第一个位置可以直接走到最后一个位置,说明没一层这是一个圆坑2:第i行的第一个位置可以直接走到上面一行的最后一个位置,这尼玛还是一个圆锥啊。设dp[i][j]表示到(i,j)时最小的分数,从下往上推dp目标 dp[1...
阅读全文
摘要:又是水DP设dp[i][0] 用勺子吃完第i个菜需要的最小时间 dp[i][1] 用筷子吃完第i个菜需要的最大时间DP目标min(dp[n][0],dp[n][1])状态转移:dp[i][0] = min(dp[i-1][0]+a,dp[i-1][1]+a+c);dp[i][1] = min(dp...
阅读全文
摘要:多重背包的二进制优化题目要求是把所有的物品分成两部分,使得两部分价值之和相等可以先把总的价值之和m求出然后除2,(如果m是奇数,可以直接Can't)然后把第i种大理石分成a[i]个独立的物品,价值和费用都为i,然后把这些物品放入容量为m的背包,如果能恰好放满,则说明可以划分。时间复杂度O(m*n)m...
阅读全文
摘要:总的来说这题主要难点不在于怎么DP,而在于怎么优化总的长度有1e9,这根本没办法枚举,所以肯定想办法优化,总的长度有1e9 而石子总共最多才有100个这说明两个相邻石子之间可能有很长一段是空的,而这空的之间肯定会从某个点开始到后面的dp值是一样的,所以问题就在于怎么找到这个开始的点,这有一个定理:两...
阅读全文
摘要:和环形石子合并一个德行的一道题,区间DP唯一的区别在于计分方式,转移方程也有所不同dp[i][j]表示合并i到j和能得到的最大的能量dp[i][j] = max{f[i]*r[k]*r[j]+dp[i][k]+dp[k+1][j]|i 2 #include 3 #include 4 #inclu...
阅读全文
摘要:这题我真的不想说什么了,真尼玛恶心,整整一个晚上,就让一个下标从0从1开始给整这了这题本身确实不难,就是麻烦,交了8次,错了8次,本来以为是状态转移的时候出了问题,一直在那找,改了改又改,从对改到错,又从错改到更错,最后没办法又找的别人的代码。。算了,啥也不多说了。。就是个01背包DP时,对于附件直...
阅读全文