Codeforces 999F Cards and Joy 【dp】【性质】

 读完这道题后应该想到牌有多少张都是什么不重要,重要的是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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯 2011年第二届C语言初赛试题(3)

1、假设有两种微生物 X 和 Y X出生后每隔3分钟分裂一次&#xff08;数目加倍&#xff09;&#xff0c;Y出生后每隔2分钟分裂一次&#xff08;数目加倍&#xff09;。 一个新出生的X&#xff0c;半分钟之后吃掉1个Y&#xff0c;并且&#xff0c;从此开始&#xff0c…

MATLAB凸包Convex hull运算

凸包Convex hull运算&#xff08;求离散点的边界&#xff09; [k,a] convhull(x,y); K convulln(X, options);[K AV] convexHull(DT);tsearch :搜索Delaunay三角形delaunay :Delaunay三角化dsearch :求最近点 (这是两个有趣的函数)inpolygon :搜索多边形…

MATLAB Floyd算法

Floyd算法 Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法。 核心思路 通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。 从图的带权邻接矩阵A=[a(i,j)] nn开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(…

父组件 子组件渲染

子组件使用v-if判断后渲染。 v-if 也是惰性的&#xff1a;如果在初始渲染时条件为假&#xff0c;则什么也不做——直到条件第一次变为真时&#xff0c;才会开始渲染条件块。 转载于:https://www.cnblogs.com/mengfangui/p/9228137.html

介绍Spring Integration

在本文中&#xff0c;我们介绍Spring Integration 。 如果您以前没有使用过Spring Integration&#xff0c;那么可能会帮助您复习Gregor Hohpe的Enterprise Integration Patterns 。 我还将推荐Josh Long 撰写的这篇出色的介绍性文章 。 上下文设置 简而言之&#xff0c; 企业…

蓝桥杯 2011年第二届C语言初赛试题(4)

4、某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪&#xff1a; 每位选手需要回答10个问题&#xff08;其编号为1到10&#xff09;&#xff0c;越后面越有难度。答对的&#xff0c;当前分数翻倍&#xff1b;答错了则扣掉与题号相同的分数&#xff08;选手必须回答…

各种资源(持续更新中)

寻找网页设计灵感的27个最佳网站推荐http://www.cnblogs.com/lhb25/archive/2011/04/19/2014303.html 模板王http://www.mobanwang.com/ http://sc.chinaz.com/

Katy Perry - E.T.

作曲 : Katy Perry, Łukasz Gottwald, Max Martin, Joshua Coleman 作词 : Katy Perry, Łukasz Gottwald, Max Martin, Joshua Coleman Youre so hypnotizing // hypnotize /ˈhipnəˌtīz / v.催眠,捕捉全部注意力,吸引 Could you be the devil? 你可会是那魔鬼&#xf…

使用Gradle禁止Java和Spring Boot Web应用程序中的FindBugs警告

如何在 Spring Boot和 Java应用程序中使用注释抑制FindBugs警告 如果您的构建由于FindBugs问题而中断&#xff0c;并且是假阳性&#xff0c;或者由于其他考虑而无法解决问题&#xff0c;则可以添加注释来忽略Findbugs警告。 更新您的Gradle依赖关系 您将需要在build.gradle文…

true,false组合问题

题目&#xff1a;给定n个布尔变量x1,x2,x3…xn&#xff0c;希望输出所有可能的布尔变量组合。例如当n&#xff1d;&#xff12;时&#xff0c;有&#xff14;种组合&#xff1a;a、true,true;b、true,faulse;c、faulse,true;d、faulse,faulse。请编写一个&#xff23;程序实现这…

更改matlab默认启动路径

1. 系统默认的启动路径是“我的文档”里的work目录&#xff0c;如果想要更改启动路径&#xff0c;解决方法是修改桌面上 MATLAB 快捷方式的属性&#xff0c;将原本的参数“目标” -sd 后面的 $documents\MATLAB 替换成自己的目录即可。我试了很多种方法&#xff0c;就这个最好使…

配置gitlab通过smtp发送邮件

https://www.centos.bz/2017/08/gitlab-send-email-with-smtp/ 1. 编辑/etc/gitlab/gitlab.rb文件&#xff08;加到文件最后面就好了&#xff09;。以QQ企业邮箱为例&#xff1a; gitlab_rails[smtp_enable] truegitlab_rails[smtp_address] "smtp.exmail.qq.com"g…

蓝桥杯 2011年第二届C语言初赛试题(5)

今盒子里有n个小球&#xff0c;A、B两人轮流从盒中取球&#xff0c;每个人都可以看到另一个人取了多少个&#xff0c;也可以看到盒中还剩下多少个&#xff0c;并且两人都很聪明&#xff0c;不会做出错误的判断。我们约定&#xff1a;每个人从盒子中取出的球的数目必须是&#x…

CUBA平台–用于快速应用程序开发的开源Java框架

传统上&#xff0c;自计算时代开始以来&#xff0c;企业软件开发自然面临着一个挑战&#xff0c;当时自然而然地&#xff0c;企业软件开发本应专注于解决实际的业务问题&#xff0c;但与此同时&#xff0c;开发人员必须在技术上花费大量时间和精力。解决方案的一面&#xff0c;…

C#与mongoDB初始环境搭建

mongoDB官网https://www.mongodb.com/ mongoDB默认安装路径(Windows x64平台) C:\Program Files\MongoDB\Server\3.4\bin mongoDB环境变量配置 启动mongoDB服务 > mongod -dbpath D:\mongodb > mongo Visual Studio引用mongoDB PM> install-package M…

浅析MATLAB中的内联函数、匿名函数和函数函数

内联函数 内联&#xff08;inline&#xff09;函数是MATLAB 7以前经常使用的一种构造函数对象的方法。在命令窗口、程序或函数中创建局部函数时&#xff0c;通过使用inline构造函数&#xff0c;而不用将其储存为一个M文件&#xff0c;同时又可以像使用一般函数那样调用它。 MA…

二十世纪数学家排名

二十世纪数学家排名 陈彬整理2010.1.1 1.A.N.Kolmogorov(柯尔莫哥(戈)洛夫)——为概率论建立了公理体系的俄罗斯人&#xff0c;但排第一似乎有些不妥? 2.H.Poincare(庞加莱(Jules Henri Poincar))——有些人不需要说明&#xff0c;H.庞加莱就是其中之一。 3.D.Hilbert(希尔伯特…

Matlab英文操作系统下中文乱码的解决方案

打开注册表&#xff08;win&#xff0b;R&#xff0c;运行框中输入regedit&#xff09;&#xff0c;然后进入HKEY_CURRENT_USER\Control Panel\International&#xff0c;将右侧 &#xff1a; "Locale""00000409" 改成 "Locale""00000804&q…

Git 从了解到放弃

1. 简单介绍 1.1. git起源 在1991年linus创建了Linux从此linux成为服务器领域的佼佼者&#xff0c;大部分web服务器、邮件、数据库各种服务器端程序都安装在了linux上面运行&#xff0c;主要是因为它运行的快速、高效、利用率高&#xff0c;这样一个优秀的系统并不是一个人在维…

LIS(Longest Increasing Subsequence)最长上升(不下降)子序列

有两种算法复杂度为O(n*logn)和O(n^2)O(n^2)算法分析如下&#xff1a; &#xff08;a[1]...a[n] 存的都是输入的数&#xff09;1、对于a[n]来说&#xff0c;由于它是最后一个数&#xff0c;所以当从a[n]开始查找时&#xff0c;只存在长度为1的不下降子序列&#xff1b;2、若从a…