读完这道题后应该想到牌有多少张都是什么不重要,重要的是player的favorite number是怎么分配的。(因为不是任何player的favorite number不能带来任何joy)然后每个favorite number带来的joy互相不受影响,因为如果favorite number不一样,对应的player肯定不一样。因此我们可以计算每个【favorite number带来的贡献】。

因此想到dp[i][j]代表i个人分j个favorite number的最大joy(favorite number具体是多少其实不重要),

转移方程 dp[i][j] = dp[i-1][j-c] + h[c]   枚举第i个人拿c张牌// c = 0 - min(j,k) 【因为一个人最多拿k张牌】,代价为k

所以整体复杂度是n* (n*k) * k ==> O(n^2 * k^2)。能过

然后这道题我用递归和递推都写了一遍,两个速度差不多。递推并不能保证比递归快,关键还是看状态数

再补充一下转移代价与时间复杂度之间为什么是相乘的关系,我以前一直没想清楚:

实际上是这一层的状态得到要考虑上一层的j个状态,然后这一层的每个状态都要考虑到上一层的j个状态,上一层的状态被重复考虑了。这就是为什么【简单运用】的话线段树能优化dp,因为能区间max,但实际上很复杂,听说要涉及凸包orz

 1 #include<iostream>
 2 #include<map>
 3 #include<cstring>
 4 using namespace std;
 5
 6
 7 //只需要考虑每个number带来的贡献,不是任何人favorite number的数没有贡献
 8 int a[5005],h[15],favorite[505];//favorite[i]为第i个player的favorite number
 9 int vis[100005],ans;
10 map<int,int> m1,m2;
11
12 int dp[505][5005];// dp[i][j]为i个人分j个favorite number的最大joy
13
14 int main(){
15     int n,k; cin>>n>>k;
16     for(int i=1;i<=n*k;i++) {
17         cin>>a[i];
18         m1[ a[i] ] ++;//这个number一共有多少个
19     }
20     for(int i=1;i<=n;i++){
21         cin>>favorite[i];
22         m2[ favorite[i] ]++;//这个number是多少人的favorite
23     }
24     for(int i=1;i<=k;i++) cin>>h[i];
25
26     for(int i=1;i<=n;i++){
27         for(int j=0;j<=i*k;j++){
28             for(int c=0;c<=min(j,k);c++) dp[i][j] = max( dp[i][j],dp[i-1][j-c]+h[c] );//第i个人分c个favorite number
29         }
30     }
31
32     for(int i=1;i<=n;i++){
33         if( vis[ favorite[i] ] ) continue;
34         ans+=dp[ m2[favorite[i]] ][ min( m2[favorite[i]]*k, m1[ favorite[i]]  ) ];
35         vis[ favorite[i] ] = 1;
36     }
37
38     cout<<ans;
39
40     return 0;
41 }

转载于:https://www.cnblogs.com/ZhenghangHu/p/9226458.html

Codeforces 999F Cards and Joy 【dp】【性质】相关推荐

  1. CodeForces - 1312E Array Shrinking(区间dp)(通俗易懂)

    CodeForces - 1312E Array Shrinking(区间dp) 题目链接: 没做出来,看了一下别人的题解,才A掉.但网上没发现一篇讲得比较易懂的题解,所以就准备写一篇再加上我自己的理 ...

  2. 【CodeForces 1253C --- Sweets Eating】DP

    [CodeForces 1253C --- Sweets Eating]DP Description Tsumugi brought n delicious sweets to the Light M ...

  3. Cards and Joy CodeForces - 999F (贪心+set)

    There are nn players sitting at the card table. Each player has a favorite number. The favorite numb ...

  4. codeforces Palindromic characteristics(hash或者dp)

    1.动态规划 用dp(l,r)表示子串s[l..r]的回文串阶数.对于长度len为1的有dp(l,r)=1.对于长度len等于2的,看字符串左右是否相等即可.当r-l>1时,如果s[l]不等于s ...

  5. codeforces 808 E. Selling Souvenirs (dp+二分+思维)

    题目链接:http://codeforces.com/contest/808/problem/E 题意:最多有100000个物品最大能放下300000的背包,每个物品都有权值和重量,为能够带的最大权值 ...

  6. Codeforces 429B Working out:dp【枚举交点】

    题目链接:http://codeforces.com/problemset/problem/429/B 题意: 给你一个n*m的网格,每个格子上有一个数字a[i][j]. 一个人从左上角走到右下角,一 ...

  7. CodeForces - 1551F Equidistant Vertices(暴力+dp)

    题目链接:点击查看 题目大意:给出一棵 nnn 个节点组成的树,问选出 kkk 个节点满足相互之间距离相等的方案数有多少 题目分析:n=100n=100n=100,感觉数据范围越小的题目越难发现 ta ...

  8. CodeForces - 1481E Sorting Books(贪心+dp)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,每次操作可以将任意一本书放到序列的末尾,问最少需要操作多少次,才能使得相同的数字挨在一起 题目分析:不难看出,对每个位置的数都操作一次,是 ...

  9. CodeForces - 1509C The Sports Festival(dp)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的数列,现在需要对其进行重排列,使得贡献之和最小 对于一个排列的贡献来说,对于每个 iii ,则 di=max(a1,a2,...,ai)−min ...

最新文章

  1. Web字体库下载及转换工具
  2. 机器人用上AI后,拥有了堪比人类皮肤的触觉:轻松引线穿针、夹取鸡蛋丨Science子刊...
  3. 50. Leetcode 105. 从前序与中序遍历序列构造二叉树 (二叉树-二叉树构建)
  4. 4:springApplication.run 原理
  5. 基于Elasticsearch实现搜索推荐
  6. word 编辑域中的汉字_word中插入的cad对象无法双击编辑问题解决记录
  7. python使用md5加密_如何使用Python构建加密机器人并将其连接到Facebook Messenger
  8. ESLint使用文档
  9. dismiss和remove_remove的近义词辨析
  10. 多线程java_40个Java多线程问题总结
  11. Makefile--如何将当前文件下的所有*.cpp文件与*.c文件全部生成相应的可执行文件
  12. 济南市全国计算机二级,山东省济南市2019年下半年全国计算机等级考试报名时间...
  13. 华人小哥打造乔布斯版ChatGPT,网友:感觉他复活了
  14. vxe-input vue 日期选择组件带农历节日、小圆点提醒
  15. 俞渝年轻图片_组图:2007中国职场女性榜样-俞渝
  16. Cannot get property '......' on extra properties extension as it does not exist
  17. 自动驾驶L1至L5智能化程度分级
  18. IPv6技术精要--第17章双栈和隧道
  19. mysql cast 和 pgsql cast
  20. 算法是怎样一步步毁掉年轻人的世界的

热门文章

  1. mongodb如何写入图片_CTO之瞳-数据库-MongoDB
  2. java关闭websocket_关闭代码1006关闭websocket的原因
  3. ios点击大头针气泡不弹出_iOS高德地图之自定义大头针and泡泡view
  4. FFmpeg NDK跨平台交叉编译
  5. 原生态基于OpenCV图像处理软件开发
  6. C 实现高性能内存池
  7. access无法与wincc链接_wincc和Access连接写如变量
  8. python大型项目经验_图像分类:13个Kaggle项目的经验总结
  9. php mysql crud demo_基于php和mysql的简单的dao类实现crud操作功能_PHP教程
  10. 计算机应用基础人才培养方案,1. 培养方案(计算机应用基础课程).doc