有意思的DP(CF360B Levko and Array)
2024-09-06 12:01:27
刚才面试了一个蛮有意思的DP题目,脑子断片,没写出来,不过早上状态还是蛮好的
一个长度为n的序列最多改变k次,使相邻两数之差绝对值的最大值最小
三维的dp我先尝试写一下
Codeforces 360B Levko and Array
其实是n^2logm的,太nb了
去二分答案这个很好想,因为既然这个数满足,大于它肯定满足,然后就是去判断这个数字存不存在了。很容易想到贪心,但是贪心会有个问题,就是你无法确定你要修改的哪个数,很容易你就可以找到自己的bug。最后这个是个dp,dp[i]表示从n到i需要修改的最小的次数
当然是把全部往等差(这个差可以有符号)数列搞,我最初想的是找到平均数,平均数是不可能的,因为有时候改一个会很影响平均数
那就是判断这个数字合不合法,并不需要去判断这个数字需要改成什么,需要改成什么太难想的,因为其实满足的是一个范围
可以倒着来,因为这个满足了,之前的肯定满足。
然后就去找是不是有满足的,满足就是相当于在前一个状态上加上从i到j的差-1,和第一个一样
然后就可以判断了,非常完美的代码,佩服啊
#include <bits/stdc++.h>
using namespace std;
const int N = 2e3 + ;
int n, k, dp[N], a[N]; bool check(int m)
{
for (int i = n; i > ; i--)
{
dp[i] = n - i - ;
for (int j = i + ; j <= n; j++)
{
if (abs(a[j] - a[i]) <= m * 1LL * (j - i))
dp[i] = min(dp[i], dp[j] + j - i - );
}
if (dp[i] + i <= k)
return true;
}
return false;
} int main()
{
cin >> n >> k;
for (int i = ; i <= n; i++)
cin >> a[i];
int l = , r = 2e9;
while (l < r)
{
int m = l + ((r - l) >> );
//cout << l << " " << r << " "<<m<<"\n";
if (check(m))
r = m;
else
l = m + ;
}
cout << r;
return ;
}
最新文章
- mac下使用gcc
- chart.js插件生成折线图时数据普遍较大时Y轴数据不从0开始的解决办法[bubuko.com]
- JavaBean,POJO,VO,DTO的区别和联系
- vue data对象添加新属性触发视图
- DataTable详解,以及dataview
- Creating a Unique File Name
- [leetcode]_Same Tree
- Spring事务Transaction配置的五种注入方式详解
- CSS布局中——导航是非常常见的
- 使用ServiceStackRedis链接Redis简介
- SQL Server 日志收缩
- GCD实现倒计时
- kafka简单回顾
- Zynq系列程序逻辑固化方法
- Directx11代码下载
- 51nod1042
- java 之DelayQueue,TaskDelayed,handlerFactory,dataChange消息配置.收发等.java spring事务处理TransactionTemplate
- redis利用key计时与计数
- 清华大学 pip 源
- (转)理解YOLOv2训练过程中输出参数含义
热门文章
- 使用async读取异步数据
- Umount- Linux必学的60个命令
- mysqlbinlog: unknown variable &#39;default-character-set=utf8&#39;
- Python-购物车系统
- 关于Cocos2d-x多线程异步载入资源的问题
- idea短信验证
- apache支持多主机头,并防止恶意空主机头的配置实现
- python-基础-面向对象2-异常-模块工厂模式
- T2483 电梯(模拟题)
- leetcode 57 Insert Interval &; leetcode 1046 Last Stone Weight &; leetcode 1047 Remove All Adjacent Duplicates in String &; leetcode 56 Merge Interval