博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Educational Codeforces Round 63-D(基础DP)
阅读量:5899 次
发布时间:2019-06-19

本文共 1014 字,大约阅读时间需要 3 分钟。

题目链接:https://codeforces.com/contest/1155/problem/D

题意:给定n个数,可以选择一段连续子段将其乘x,也可以不操作,求最大连续子段和。

思路:比赛时觉得是dp,但怎么也想不出来QAQ,dp太难了。。。赛后看了别人题解,找到状态和转移方程就很简单了,然而比赛时我就是想不到。。。

考虑下标i:有3种情况,可能[0,i]都没有乘x,可能i乘了x,可能[i,n]都不会乘x。分别用dp[i][0]表示以i结尾的最长子段和且 [0,i]都没乘x,dp[i][1]表示以i结尾的最长子段和且i要乘x,dp[i][2]表示以i结尾的最长子段和且[i,n]都不会乘x。

则状态转移方程为:dp[i][0]=max(dp[i-1],0)+a[i];

         dp[i][1]=max(dp[i-1][0],dp[i-1][1],0)+a[i]*x;

         dp[i][2]=max(dp[i-1][1],dp[i-1][2],0)+a[i];

加油!!下一次会更好!

AC代码:

#include
#include
using namespace std;typedef long long LL;int n,x;LL dp[300005][3],ans;int main(){ scanf("%d%d",&n,&x); for(int i=1;i<=n;++i){ LL tmp; scanf("%lld",&tmp); dp[i][0]=max(dp[i-1][0],0LL)+tmp; dp[i][1]=max(dp[i-1][0],max(dp[i-1][1],0LL))+1LL*tmp*x; dp[i][2]=max(dp[i-1][1],max(dp[i-1][2],0LL))+tmp; ans=max(ans,max(dp[i][0],max(dp[i][1],dp[i][2]))); } printf("%lld\n",ans); return 0;}

 

转载于:https://www.cnblogs.com/FrankChen831X/p/10761791.html

你可能感兴趣的文章
Linux命令-uptime
查看>>
笔记本电脑电池保养
查看>>
网页基础编程第二章
查看>>
oracle 删除外键约束 禁用约束 启用约束
查看>>
JSP----九大内置对象
查看>>
usermod命令
查看>>
Exchange 2013 配置默认电子邮件地址策略
查看>>
有意思的图片组合飞入效果
查看>>
python3.5opencv3图像文字标注
查看>>
安装UChome中遇到的俩问题
查看>>
暑期书单
查看>>
iptables从入门到精通
查看>>
MonkeyRunner+PowerTutor简单耗电测试
查看>>
一、页面做完右侧留白
查看>>
WPF 对控件其类型的继承方式(七)
查看>>
apache安装,镇博
查看>>
test1
查看>>
Python - while循环
查看>>
NFS配置及详解
查看>>
结合Ngx_lua运用Nginx预加载热点数据
查看>>