题目链接
题意: 给一个初始纯度值 m m m,一共度过 n n n天,给出序列 a [ i ] a[i] a[i]和 b [ i ] b[i] b[i],第 i i i天可以执行下列操作方案之一:

  1. 不操作;
  2. 用 a [ i ] a[i] a[i]纯度值换取 b [ i ] b[i] b[i]金钱收益;
  3. 用 a [ i ] a[i] a[i]纯度值换取 2 ∗ b [ i ] 2*b[i] 2∗b[i]金钱收益,但是第 i + 1 i+1 i+1天的金钱收益 b [ i + 1 ] b[i+1] b[i+1]将降为 ⌊ b [ i + 1 ] 2 ⌋ \lfloor\frac{b[i+1]}{2}\rfloor ⌊2b[i+1]​⌋,而且第 i + 1 i+1 i+1天只能选择操作 1 1 1和操作 2 2 2;
  4. 用 a [ i ] a[i] a[i]纯度值换取 3 ∗ b [ i ] 3*b[i] 3∗b[i]金钱收益,但是第 i + 1 i+1 i+1天的金钱收益 b [ i + 1 ] b[i+1] b[i+1]将降为 0 0 0,第 i + 2 i+2 i+2天的金钱收益 b [ i + 2 ] b[i+2] b[i+2]将降为 ⌊ b [ i + 2 ] 3 ⌋ \lfloor\frac{b[i+2]}{3}\rfloor ⌊3b[i+2]​⌋,而且第 i + 2 i+2 i+2天只能选择操作 1 1 1和操作 2 2 2;

求一种方案使得获得的总金币收益最大。

数据范围: 1 ≤ n ≤ 10000 1\leq n\leq 10000 1≤n≤10000, 1 ≤ m ≤ 10000 1\leq m\leq 10000 1≤m≤10000, 1 ≤ a [ i ] ≤ 10000 1≤a[i]≤10000 1≤a[i]≤10000, 0 ≤ b [ i ] ≤ 1 0 9 0≤b[i]≤10^9 0≤b[i]≤109

思路:
因为 n n n和 m m m是 1 e 4 1e4 1e4,考虑用 O ( n m ) O(nm) O(nm)的dp来做,
设 d p [ i ] [ j ] dp[i][j] dp[i][j]是到第 i i i天,已消耗纯度值为 j j j的最大收益,
可以根据上面四种操作方案,可以对应写出转移方程:
1. d p 1.\ \ dp 1.  dp [ i ] [i] [i] [ j ] = d p [j]=dp [j]=dp [ i − 1 ] [i-1] [i−1] [ j ] [j] [j]
2. d p 2.\ \ dp 2.  dp [ i ] [i] [i] [ j ] = d p [j]=dp [j]=dp [ i − 1 ] [i-1] [i−1] [ j − a [ i ] ] + b [ i ] [j-a[i]]+b[i] [j−a[i]]+b[i]
3. j ≥ 1 3.\ \ j\geq 1 3.  j≥1时, d p dp dp [ i ] [i] [i] [ j ] = m a x ( d p [j]=max(dp [j]=max(dp [ i − 2 ] [i-2] [i−2] [ j − a [ i − 1 ] ] + 2 ∗ b [ i − 1 ] , d p [j-a[i-1]]+2*b[i-1],dp [j−a[i−1]]+2∗b[i−1],dp [ i − 2 ] [i-2] [i−2] [ j − a [ i − 1 ] − a [ i ] ] + 2 ∗ b [ i − 1 ] + b [ i ] / 2 ) [j-a[i-1]-a[i]]+2*b[i-1]+b[i]/2) [j−a[i−1]−a[i]]+2∗b[i−1]+b[i]/2)
4. j ≥ 2 4.\ \ j\geq 2 4.  j≥2时, d p dp dp [ i ] [i] [i] [ j ] = m a x ( d p [j]=max(dp [j]=max(dp [ i − 3 ] [i-3] [i−3] [ j − a [ i − 2 ] ] + 3 ∗ b [ i − 2 ] , d p [j-a[i-2]]+3*b[i-2],dp [j−a[i−2]]+3∗b[i−2],dp [ i − 3 ] [i-3] [i−3] [ j − a [ i − 2 ] − a [ i ] ] + 3 ∗ b [ i − 2 ] + b [ i ] / 3 ) [j-a[i-2]-a[i]]+3*b[i-2]+b[i]/3) [j−a[i−2]−a[i]]+3∗b[i−2]+b[i]/3)
然后让 d p [ i ] [ j ] dp[i][j] dp[i][j]从上面的4个转移方程中取 m a x max max。
但是 n ∗ m = 1 0 8 n*m=10^8 n∗m=108,所以开 1 e 8 1e8 1e8大小的 l o n g l o n g long\ long long long会 M L E MLE MLE,
从上面的转移方程可以看到, d p [ i ] dp[i] dp[i]的转移只用到了 d p [ i − 1 ] 、 d p [ i − 2 ] 、 d p [ i − 3 ] dp[i-1]、dp[i-2]、dp[i-3] dp[i−1]、dp[i−2]、dp[i−3],所以可以用滚动数组,对 i i i这一维滚动,周期是 4 4 4。这样的时间复杂度是 O ( n ∗ m ) O(n*m) O(n∗m),空间复杂度是 O ( m ) O(m) O(m),这样就能过了。

//AC code
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e4+7,M=4;
#define I(t) ((t+M)%M)
int n,m,a[N];
LL b[N],dp[M][N],ans;
int main(){cin>>n>>m;for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=1;i<=n;i++)scanf("%lld",&b[i]);for(int i=1;i<=n+2;i++){for(int j=1;j<=m;j++){dp[I(i)][j]=dp[I(i-1)][j];//1if(j-a[i]>=0)dp[I(i)][j]=max(dp[I(i)][j],dp[I(i-1)][j-a[i]]+b[i]);//2if(i>1){if(j-a[i-1]>=0)dp[I(i)][j]=max(dp[I(i)][j],dp[I(i-2)][j-a[i-1]]+2*b[i-1]);//3if(j-a[i-1]-a[i]>=0)dp[I(i)][j]=max(dp[I(i)][j],dp[I(i-2)][j-a[i-1]-a[i]]+2*b[i-1]+b[i]/2);//3}if(i>2){if(j-a[i-2]>=0)dp[I(i)][j]=max(dp[I(i)][j],dp[I(i-3)][j-a[i-2]]+3*b[i-2]);//4if(j-a[i-2]-a[i]>=0)dp[I(i)][j]=max(dp[I(i)][j],dp[I(i-3)][j-a[i-2]-a[i]]+3*b[i-2]+b[i]/3);//4}ans=max(ans,dp[I(i)][j]);}}cout<<ans;
}

减小常数的方法: 使用了滚动数组,要进行 1 e 8 1e8 1e8次取模会很慢,所以可以预处理模数; 可以根据转移方程的条件,例如 j − a [ i ] > = 0 j-a[i]>=0 j−a[i]>=0,删减无意义的循环。

[QLU Regular Contest 003] G.Youmu with greedy money problem //dp+滚动数组相关推荐

  1. QLU Regular Contest 003 D Youmu with beautiful dolls queue

    原题链接:QLU Regular Contest 003 D题的链接 题意: 有 N N N个数的数组, M M M个操作如下: P O P B A C K POP \ BACK POP BACK 数 ...

  2. AtCoder Beginner Contest 264 G.String Fair(最短路/暴力dp 补写法)

    题目 n(n<=18278)个串,第i个串Ti(Ti为纯小写字母串且长度不超过3), 得分Pi(-1e9<=Pi<=1e9),表示只要子串中出现一次Ti,就会获得Pi的得分 对于你可 ...

  3. AtCoder Regular Contest 061 E - Snuke‘s Subway Trip(建图 + dijkstra最短路 / 0/1bfs / 并查集)

    AtCoder Regular Contest 061 E - Snuke's Subway Trip problem 洛谷翻译 my idea 最近一直在做网络流,所以一读这题后,我就想到了最小费用 ...

  4. NOMURA Programming Contest 2021(AtCoder Regular Contest 121)

    文章目录 A - 2nd Greatest Distance B - RGB Matching C - Odd Even Sort D - 1 or 2 E - Directed Tree F - L ...

  5. AtCoder Beginner Contest 215 G - Colorful Candies 2

    AtCoder Beginner Contest 215 G - Colorful Candies 2 有n个糖果,每个糖果有着一个颜色a[i],每次拿k个糖果期望拿到E(x)个不同颜色的糖果,求出k ...

  6. AtCoder Regular Contest 065

    AtCoder Regular Contest 065 C - Daydream Score : 300300300 points 倒着来就行了,正着来会产生歧义匹配,dreamer,dreamdre ...

  7. AtCoder Regular Contest 100 D - Equal Cut 思维 + 前缀和

    传送门 文章目录 题意: 思路: 题意: 给你一个数组aaa,你要将其分成四份,让这四份中和的最大值−-−最小值最小,输出这个最小值. n≤2e5,ai≤1e9n\le2e5,a_i\le1e9n≤2 ...

  8. AtCoder Regular Contest 100 E - Or Plus Max Sos dp

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为2n2^n2n的数组,让你对于所有的1≤k≤2n−11\le k\le 2^n-11≤k≤2n−1求最大的ai+aj,0≤i<j≤2n−1 ...

  9. AtCoder Beginner Contest 234 G - Divide a Sequence

    AtCoder Beginner Contest 234 G - Divide a Sequence 题目 给定一个长度为N的序列,任意的将其划分为任意长度大于零的若干个子串,对于任意一个子串SiS_ ...

最新文章

  1. 不同Activity之间传递数据--Bundle对象和startActivityForResult方法的实现
  2. 【干货】Linux中实用但很小众的11个炫酷终端命令
  3. MVVM实践中的Command与CommandParameter的使用
  4. 如何在 SAP 电商云里设置 Time Restrictions
  5. [导入][导入][c#]Web开发中Tag的开发技巧
  6. Java中的位运算符、移位运算
  7. 【升级版】和秋叶一起学Office
  8. win10系统office2010每次打开总是出现配置进度
  9. 计算机格式化后,电脑格式化后需要重装系统吗_格式化电脑重装系统的方法步骤...
  10. 802.11p WAVE notes
  11. ae合成设置快捷键_AE超实用快捷键你了解多少?
  12. 网络摄像视频方案整理
  13. 为知笔记导入html,为知笔记导入印象笔记
  14. springSecurity 登陆失败前台显示账号密码登录错误
  15. apriori算法的简介和改进总结
  16. 对于波特率传输一个bit的时间的计算
  17. PP-ShiTu: A Practical Lightweight Image Recognition System
  18. multisim变压器反馈式_Multisim在负反馈放大器性能测试中的应用
  19. uniapp微信公众号h5接入网易七鱼客服系统
  20. 试输出斐波那契数列的前10项

热门文章

  1. mysql分区函数_mysql 分区可用函数
  2. 一个强大的ico,图片资源网站,http://findicons.com
  3. vue 本地xlsx文件下载_vue前端项目中excel文件下载
  4. html标签table自动增加行,给表格添加行的标签
  5. 最多显示当前日期的日期选择对话框(日历)
  6. java心跳机制_Java: server/client 心跳机制实现 示例
  7. MATLAB神经网络43个案例分析【第14/15章源程序不能正常运行——一种道听途说的解决办法】
  8. [编译环境]百度深度学习平台PaddlePaddle安装、官方跑通、跑通自己想用的模型(deepLab,swin-transformer哒哒哒)
  9. 图的深度优先搜索-递归
  10. 干货|龙芯智龙平台和RT-Thread系统