D - Poisonous Full-Course-AtCoder Beginner Contest 306

2023-11-10 07:29

本文主要是介绍D - Poisonous Full-Course-AtCoder Beginner Contest 306,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

D - Poisonous Full-Course

题意:

给出n道菜,标记为0表示无毒,或解药,标记为1表示有毒。
每道菜有一个美味值,求不被毒死能够获得的最大美味值。
不被毒死有以下方法:
1.选择0号菜品。
2.选择1号菜品后选择0号菜品解毒。
注意每一份菜品非必选,可以跳过。

分析:

这是一道dp题,可以这样定义dp:
int dp[MAXN][2];
dp[i][j]表示走完前i道菜品,当前状态为j的最大美味值。
那么状态转移方程分析:
对于每一道菜有以下两种情况:

Case1:当前菜0无毒:
//dp[i][0]=max(有毒状态选中解毒,无毒状态选中保持无毒,不选保持无毒);
dp[i][0]=max(max(dp[i-1][1]+tas[i],dp[i-1][0]+tas[i]),dp[i-1][0]);
//dp[i][1],当前无毒,不会改变,和dp[i-1][1]相同
dp[i][1]=dp[i-1][1];

Case2:当前菜1有毒:
//dp[i][0]当前菜有毒所以不变
dp[i][0]=dp[i-1][0];
//dp[i][1]=max(保持有毒状态不选这道菜,上一个无毒状态选中这道菜)
dp[i][1]=max(dp[i-1][1],dp[i-1][0]+tas[i]);

代码:
#include<iostream>
using namespace std;
#define int long long
const int MAXN=1e6+5;
int dp[MAXN][2];/*dp[i][j]表示走完前i道菜品,当前状态为j的最大美味值*/
signed main()
{int n;cin>>n;int poi[n+2],tas[n+2];for(int i=1;i<=n;i++){cin>>poi[i]>>tas[i];}for(int i=1;i<=n;i++){if(poi[i]==1){dp[i][1]=max(dp[i-1][1],dp[i-1][0]+tas[i]);dp[i][0]=dp[i-1][0];}else{dp[i][0]=max(max(dp[i-1][1]+tas[i],dp[i-1][0]+tas[i]),dp[i-1][0]);dp[i][1]=dp[i-1][1];}}cout<<max(dp[n][0],dp[n][1])<<endl;
}

这篇关于D - Poisonous Full-Course-AtCoder Beginner Contest 306的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/381205

相关文章

2014 Multi-University Training Contest 8小记

1002 计算几何 最大的速度才可能拥有无限的面积。 最大的速度的点 求凸包, 凸包上的点( 注意不是端点 ) 才拥有无限的面积 注意 :  凸包上如果有重点则不满足。 另外最大的速度为0也不行的。 int cmp(double x){if(fabs(x) < 1e-8) return 0 ;if(x > 0) return 1 ;return -1 ;}struct poin

2014 Multi-University Training Contest 7小记

1003   数学 , 先暴力再解方程。 在b进制下是个2 , 3 位数的 大概是10000进制以上 。这部分解方程 2-10000 直接暴力 typedef long long LL ;LL n ;int ok(int b){LL m = n ;int c ;while(m){c = m % b ;if(c == 3 || c == 4 || c == 5 ||

2014 Multi-University Training Contest 6小记

1003  贪心 对于111...10....000 这样的序列,  a 为1的个数,b为0的个数,易得当 x= a / (a + b) 时 f最小。 讲串分成若干段  1..10..0   ,  1..10..0 ,  要满足x非递减 。  对于 xi > xi+1  这样的合并 即可。 const int maxn = 100008 ;struct Node{int

AtCoder Beginner Contest 370 Solution

A void solve() {int a, b;qr(a, b);if(a + b != 1) cout << "Invalid\n";else Yes(a);} B 模拟 void solve() {qr(n);int x = 1;FOR(i, n) FOR(j, i) qr(a[i][j]);FOR(i, n) x = x >= i ? a[x][i]: a[i][x];pr2(

CF Bayan 2015 Contest Warm Up B.(dfs+暴力)

B. Strongly Connected City time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output 题目链接: http://codeforces.com/contest/475/probl

CF Bayan 2015 Contest Warm Up A.(模拟+预处理)

A. Bayan Bus time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output 题目链接: http://codeforces.com/contest/475/problem/A The fi

AtCoder Beginner Contest 369 D - Bonus EXP 动态规划

原题链接: https://atcoder.jp/contests/abc369/tasks/abc369_d 思路:   这道题为什么要用动态规划呢,其实,对于第i个怪物,我们有打与不打两种处理方式,而对于打,我们是获得两倍的经验值,还是一倍的经验值,与我们打了奇数只怪物还是打了偶数只怪物有关了,因此我们定义dp[i][0] 为前i只怪物总共打了偶数次,dp[i][1] 为前i只怪物总

Kafka 为了避免 Full GC,竟然还在发送端设计了内存池,自己管理内存,太巧妙了...

一、开篇引出一个 Full Gc 的问题 在上一篇文章中,我们讲到了 Kafka 发送消息的八个流程,并且着重讲了 Kafka 封装了一个内存结构,把每个分区的消息封装成批次,缓存到内存里。 如下图所示: 上图中,整体是一个 Map 结构,Map 的 key 是分区,Map 的值是一个队列;队列里有一个个的小批次,里面是很多消息。 这样好处就是可以一次性的把消息发送出去,不至于来一条发送一条,

【Mysql】系统服务启动访问报错问题处理:this is incompatible with sql_mode=only_full_group_by

一、背景: 本来已经正常运行的平台,突然有一天由于对服务器进行部分操作迁移,发现jar可以正常启动,但是访问功能一直报错,监控后台日志后,发现了问题: 报错的具体信息如下: Caused by: java.sql.SQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause and conta

2015 Multi-University Training Contest 5 1009 MZL#39;s Border

MZL's Border  Problem's Link:  http://acm.hdu.edu.cn/showproblem.php?pid=5351   Mean:  给出一个类似斐波那契数列的字符串序列,要你求给出的f[n]字符串中截取前m位的字符串s中s[1...i] = s[s.size()-i+1....s.size()]的最大长度。 analyse:   过计算