CF1579G Minimal Coverage

dp好题! link to the problem

解法

首先需要观察到:如果最长线段的长度为\(maxL\),那么答案不可能超过\(2maxL\) 。

证明的话,可以用构选法来说明:当处于当前线段的尾处于区间\([0,maxL]\)时,下一个线段向右延伸;反之,当当前线段的尾处于区间\([maxL+1,2maxL]\)的话,那么下一个线段就向左延伸。由于\(maxL\)就是所有线段长度的最大值,因此不会有线段横跨\([0,maxL]\)或\([maxL+1,2maxL]\)

设 \(dp_{i,j}\)表示:第\(i\)个线段的结尾与整个覆盖区间左端点的距离为\(j\)时,该结尾与覆盖区间右端点的最小距离 \稍微有点绕

由于观察出来的结论,\(j\)只需要讨论\([0,2maxL]\)即可。

若第\(i\)个线段向左移动:\(dp_{i,max(0,j-a_i)\leftarrow dp_{i-1,j}+a_i}\)

若第\(i\)个线段向右移动:\(dp_{i,j+a_i}\leftarrow max(dp_{i-1,j}-a_i,0)\)

最后在统计答案时,答案就是\(\min_{i=0}^{2maxL}{i+dp_{n,i}}\)

代码

#include <bits/stdc++.h>
using namespace std;
#define lor(a,b,c) for(register int a=b;a<=c;++a)
#define ror(a,b,c) for(register int a=c;a>=b;--a) const int N=1e4+5,M=2005,INF=0x3f3f3f3f; int n,a[N],dp[N][M],maxlen,ans; inline void updata(int &a,int b) {a=min(a,b);} int main(){
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
#endif int qwq; for(scanf("%d",&qwq);qwq;qwq--){
scanf("%d",&n); lor(i,1,n) scanf("%d",a+i);
maxlen=0; lor(i,1,n) maxlen=max(maxlen,a[i]);
lor(i,0,n) lor(j,0,maxlen*2) dp[i][j]=INF; dp[0][0]=0;
lor(i,1,n){
lor(L,0,maxlen*2) if(dp[i-1][L]^INF){
updata(dp[i][max(0,L-a[i])],dp[i-1][L]+a[i]);
}
lor(L,0,maxlen*2-a[i]) if(dp[i-1][L]^INF){
updata(dp[i][L+a[i]],max(dp[i-1][L]-a[i],0));
}
}
ans=INF; lor(i,0,maxlen) updata(ans,i+dp[n][i]);
printf("%d\n",ans);
} return 0;
}

最新文章

  1. yii使用createCommand()增删改查
  2. XML(DOM解析)
  3. sh脚本学习之: sh脚本 、sed、awk
  4. 编译安装0bda 8179无线网卡
  5. 实现Magento多文件上传代码功能开发
  6. c#监测电脑状态
  7. Linux下截取指定时间段日志并输出到指定文件
  8. 数据结构与算法之美学习笔记:B+树(第48讲)
  9. etcd 启动错误
  10. AlexNet卷积神经网络【前向反馈】
  11. LA 3890 Most Distant Point from the Sea(半平面交)
  12. Ubuntu下配置PHP和CakePHP记录
  13. Linux:发行版安装包的下载地址
  14. Rufus 制作 USB 启动盘简单教程
  15. 向linux内核版本号添加字符/为何有时会自动添加&quot;+&quot;号或者&quot;xxx-dirty&quot;【转】
  16. 为什么每次进入命令都要重新source /etc/profile 才能生效?
  17. matlab中help所有函数功能的英文翻译
  18. Java并发编程(七)终结线程
  19. nodejs中间件拦截,express不登录无法进入后台页面
  20. 响应式布局框架 Pure-CSS 5.0 示例中文版-下

热门文章

  1. PHP获取两个时间差
  2. java 入土--集合详解
  3. jQuery $.fn.extend()方法类插件
  4. 十、RHEL Podman命令
  5. 重新整理 .net core 实践篇 ———— linux上排查问题实用工具 [外篇]
  6. 基于socket开发网络调试助手
  7. kubeedge架构与核心设计---https://bbs.huaweicloud.com/webinar/100009
  8. 自学 TypeScript 第三天 使用webpack打包 TS 代码
  9. 【Java集合框架001】为什么重写equals就要重写hashcode?
  10. 决策树(二):后剪枝,连续值处理,数据加载器:DataLoader和模型评估