正题

题目大意:https://www.luogu.org/problemnew/show/P4945


题目大意

第isi\ si s可以

  1. 获取1∼i1\sim i1∼i中最大的能量
  2. 获取1∼i1\sim i1∼i中类型为xix_ixi​的能量
  3. 下一秒能量加倍(只能使用mmm次,不可以连续使用)

求最大获取能量


解题思路

考虑dpdpdp,定义fi,j,kf_{i,j,k}fi,j,k​表示第isi\ si s和使用了jjj次加倍,这次是否使用加倍
首先我们如果获取能量肯定是选择111和222操作中最多的那个,
定义w=max{max{pj}(j≤i),∑j=1ipj∗(kj==xi)}w=max\{max\{p_j\}(j\leq i),\sum_{j=1}^ip_j*(k_j==x_i)\}w=max{max{pj​}(j≤i),j=1∑i​pj​∗(kj​==xi​)}
第一个好求,第二个我们可以用离散化

然后开始dpdpdp,如果这次使用魔法
fi,j,1=fi−1,j−1,0f_{i,j,1}=f_{i-1,j-1,0}fi,j,1​=fi−1,j−1,0​
然后如果获取能量
fi,j,0=max{fi−1,j,0+w,fi−1,j,1+2∗w}f_{i,j,0}=max\{f_{i-1,j,0}+w,f_{i-1,j,1}+2*w\}fi,j,0​=max{fi−1,j,0​+w,fi−1,j,1​+2∗w}

时间复杂度:O(2nm)O(2nm)O(2nm)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=5e4+10,M=510;
int n,m,k[N],p[N],x[N],len;
int ans,b[N],w[N],f[N][M][2],maxs;
int main()
{//f[i][j][0/1]表示第i秒,还剩下j个加倍,上一秒是否使用了魔法scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d%d",&k[i],&p[i]);b[i]=k[i];} sort(b+1,b+1+n);len=unique(b+1,b+1+n)-b-1;for(int i=1;i<=n;i++){scanf("%d",&x[i]);int check=x[i];x[i]=lower_bound(b+1,b+1+len,x[i])-b;if(check!=b[x[i]]) x[i]=0;k[i]=lower_bound(b+1,b+1+len,k[i])-b;}memset(f,0xcf,sizeof(f));f[0][0][0]=0; for(int i=1;i<=n;i++){maxs=max(maxs,p[i]);w[k[i]]+=p[i];int z=max(maxs,w[x[i]]);for(int j=0;j<=m;j++){if(j!=0) f[i][j][1]=f[i-1][j-1][0];f[i][j][0]=max(f[i-1][j][0]+z,f[i-1][j][1]+2*z);if(i==n)ans=max(ans,max(f[i][j][1],f[i][j][0]));}}printf("%d",ans);
}

P4945-最后的战役【dp,离散化】相关推荐

  1. 过河(dp+离散化)

    过河 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点 ...

  2. HDU 6447 YJJ's Salesman(树状数组优化DP + 离散化)

    HDU 6447 YJJ's Salesman 题目 给一个二维数组,从(0,0)走到(1e9, 1e9).每次只能走右,下,右下,三个方向.其中只有通过右下走到特定给出的点(村庄)时才会获得分值.问 ...

  3. poj3666(基础dp+离散化)

    题目链接:http://poj.org/problem?id=3666 Making the Grade Time Limit: 1000MS   Memory Limit: 65536K Total ...

  4. *POJ3666.Making the Grade(DP+离散化)

    题目链接:http://poj.org/problem?id=3666 题意:求将一个序列调整成纯单调(可以相等)的序列所需要的最小代价 解题思路: 分两种情况讨论: ①不减序列:dp[i][j]表示 ...

  5. poj3666(DP+离散化)

    题目链接:http://poj.org/problem?id=3666 思路: 看了讨论区说本题的数据比较弱,只需要考虑不减序列即可,比较懒,所以我也只写了这一部分的代码,思路都一样,能AC就行了. ...

  6. P2101-命运石之门的选择【dp,离散化】

    前言 我切掉这道题是命运石之门的选择 正题 题目链接:https://www.luogu.org/problemnew/show/P2101 题目大意 nnn个连在一起的高度hih_ihi​盒子.一个 ...

  7. kuangbin专题十二 基础DP

    kuangbin专题十二 基础DP A - HDU1024 Max Sum Plus Plus B - HDU1029 Ignatius and the Princess IV C - HDU1069 ...

  8. poj 3378 Crazy Thairs

    题意/Description:     These days, Sempr is crazed on one problem named Crazy Thair. Given N (1 ≤ N ≤ 5 ...

  9. hdu-4028 The time of a day

    /**题意:给你1~n个数,问你它的子集内有多少集合的Lcm(最小公倍数)大于等于m的:题解:DP离散化,用map映射一下,map<LL,LL>dp[i].表示i个数,可以有it-> ...

最新文章

  1. python和c先学哪个对于初中生来说-初中生想学编程,请问先学C语言好还是先学Python?...
  2. mysql 临时文件目录_MySQL数据库的临时文件究竟储存在哪里
  3. plsql如何显示表结构图_【论文攻略】排版技巧——如何用 Word 编辑参考文献
  4. anaconda 包区别 版本_我是如何用Anaconda来管理Python的
  5. php方法 隐藏手机号中间四位
  6. 五道口男子计算机职业技术学院,哈哈!双鸭山大学、五道口男子职业技术学校…盘点高校那些“天雷滚滚”的绰号...
  7. cer证书生成以及签名验签详细篇(keytool 命令)
  8. 首次适应算法 动态分区分配方式的模拟 C语言——课程设计实习
  9. 算法基础—数据结构—双链表
  10. 苹果手机怎么截图,小白点截图方法
  11. F1-score值计算
  12. 项目经理修炼手册 2.1.1 程序员的基本功
  13. T3054 高精度练习-文件操作 codevs
  14. 打印机清零操作步骤分享!
  15. Jackson反序列化List
  16. GEE:指数计算(NDVI、NBR、EVI、NDMI、NDSI、TC、NDFI、EBBI、VCI、BSI、NDBI)
  17. 基于 Google Tesseract-OCR 文字识别 仿小猿搜题、作业帮
  18. win10 家庭版 多语言包 安装
  19. python查看图片颜色统计_Python通过PIL获取图片主要颜色并和颜色库进行对比的方法...
  20. 能修复受损 DNA的长寿基因?长寿的基因秘密

热门文章

  1. php 重定向数据不丢失,PHP重定向如何实现数据不丢失?
  2. java gzip 解压文件_Java实现文件压缩与解压[zip格式,gzip格式]
  3. ffmpeg库编译加文字_1.编译ffmpeg库
  4. 101. 对称二叉树023(BFS)
  5. [JavaWeb-JavaScript]JavaScript_Function函数(方法)对象
  6. [PAT乙级]1022 D进制的A+B
  7. LeetCode 110平衡二叉树-简单
  8. [蓝桥杯2016决赛]一步之遥-枚举
  9. fusionsphere读音_hydroxyapatite
  10. 数据结构---邻接矩阵的BFS