码迷,mamicode.com
首页 > 其他好文 > 详细

技巧总结

时间:2015-10-26 09:21:14      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:排序   数组   

一、某动规题目

题意:

一共有n个物品,选定每个物品有得分,并且有m个关系使得选取给定的两种物品有额外得分,选取k个物品使得得分最大。(某种物品最多跟其他两种物品有额外得分)
n<=2000,m<=2000,k<=n


初步解析:

如果我们直接设f[i][j]表示前i个物品里选j个并且选取了i的最大得分。
我们发现有一种情况无法更新。
即如果第i个物品与第i-2个物品有额外得分的话,那么我们只能在选取第i-2个物品时来加上这个额外得分。
但是在第i-1个物品的状态里,可能选取了第i-2个物品,也可能没有选取第i-2个物品,这个时候我们无法记录是否应该加上这个额外得分,并且这种更新是不成立的,因为你当前选取某物品之后是对未来的决策具有影响的。


正确解法

我们注意到上面的解法里并没有用到题里的给定条件,即每个物品至多与两个物品有绑定关系。
显然可以发现这种绑定关系是一条链。
所以我们可以把所有的物品重新排序。
即按照链的顺序排列所有的物品。
(不妨把关系(i,j)看做物品i到物品j的一条边,i<j
这样的话对于某物品i,如果有一个物品连向他,那么连向他的这个物品的新编号一定是i-1。
这样的话,继续套用上述DP方程,f[i][j]表示前i个点选取j个并且选i的最大得分。
那么显然

f[i][j]=max(max(f[k][j?1])(k<=i?2),f[i?1][j?1]+map[i?1][i])+val[i]

这样的话就完美避免了上述我们无法确定先前的状态是否选取了连向该点的点的情况。

版权声明:本文为博主原创文章,未经博主允许不得转载。

技巧总结

标签:排序   数组   

原文地址:http://blog.csdn.net/wzq_qwq/article/details/49419961

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!