P2426 删数
题目分析
由于对于题目所得的最优删法,与删除的顺序无关,因此我们可以默认从前往后删片段。
设 表示删除前 个数所得到的最大价值。
对于第 个数,它可以选择独自删除 。状态转移方程为
。
亦可以选择与前面的数一起删掉。求此时与哪几个数一起删得最大值。
表示删除 段的数。
code
点击查看代码
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int n,a[105],dp[105]; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); dp[1]=a[1]; for(int i=2;i<=n;i++){ for(int j=1;j<i;j++){ dp[i]=max(dp[i],dp[j-1]+abs(a[i]-a[j])*(i-j+1)); } dp[i]=max(dp[i],dp[i-1]+a[i]); } cout<<dp[n]<<endl; return 0; }
summary
今天这题看似很简单,想明白却不容易。
本来一开始定义的是 表示删除 段所获得的最大价值。
但接下来就遇到难点了,我们要如何枚举断点 。
如果只是将断点 看做将 字符分成两端所得到的最大价值,那可出大问题了。
对于一段字符,它的最优断法不一定是断成两段。
但是,若断点表示其中有一段删除的是,而删除 段所获得的最大价值为 。这...状态转移方程不就又出来了。
至此,根本思路与题目分析已无差别。
因此,在思考问题时,一定要注意从问题本身出发,来找状态转移方程。
作者的话
百道第题,感觉得到对是有帮助的。
加油加油加油!
--
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!