建模+线性dp——cf1201D
这类题目要首先把模型建立起来,挑选一个好的状态能让dp方程简化很多
/*
dp[i][0]表示从右到左,最后停在左端
dp[i][1]表示从左到右,最后停在右端
dp[i+1][0]=min(dis(Lpre->Ri+1)+dp[pre][0], dis(Rpre->Ri+1)+dp[pre][1]) + Ri+1-Li+1
dp[i+1][1]=min(dis(Lpre->Li+1)+dp[pre][0], dis(Rpre->Li+1)+dp[pre][1]) + Ri+1-Li+1;
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define N 200005
#define INF 0x3f3f3f3f3f3f3f3f ll n,m,k,q,b[N],L[N],R[N],dp[N][]; long long dis(ll pos1,ll pos2){//pos1->pos2的代价
if(pos1>pos2)swap(pos1,pos2);
int t=lower_bound(b+,b++q,pos1)-b;
if(t!=q+ && b[t]<=pos2)return pos2-pos1;//有夹在中间的 ll res=INF;
//找pos1左边的
if(t!=){
t--;
res=min(res,*(pos1-b[t])+pos2-pos1);
}
t=lower_bound(b+,b++q,pos2)-b;
if(t!=q+)
res=min(res,*(b[t]-pos2)+pos2-pos1);
return res;
} int main(){
memset(L,0x3f,sizeof L);
memset(R,,sizeof R);
L[]=R[]=;
cin>>n>>m>>k>>q;
for(int i=;i<=k;i++){
ll r,c;cin>>r>>c;
L[r]=min(L[r],c);
R[r]=max(R[r],c);
}
for(int i=;i<=q;i++)cin>>b[i];
sort(b+,b++q); memset(dp,0x3f,sizeof dp);
//预处理第一行
if(R[]!=)dp[][]=R[]-;//如果第一行有(1,1)之外的点,则必须停在右端
else dp[][]=dp[][]=; //点在(1,1)或没有点,则停在左右端的代价都是0 int pre=;
for(int i=;i<=n;i++)if(R[i]){
dp[i][]=min(dis(L[pre],R[i])+dp[pre][] , dis(R[pre],R[i])+dp[pre][])+R[i]-L[i];//右到左
dp[i][]=min(dis(L[pre],L[i])+dp[pre][] , dis(R[pre],L[i])+dp[pre][])+R[i]-L[i];//左到右
pre=i;
} cout<<min(dp[pre][],dp[pre][])+pre-<<'\n';
}
建模+线性dp——cf1201D的更多相关文章
- LightOJ1044 Palindrome Partitioning(区间DP+线性DP)
问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时 ...
- Codeforces 176B (线性DP+字符串)
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...
- hdu1712 线性dp
//Accepted 400 KB 109 ms //dp线性 //dp[i][j]=max(dp[i-1][k]+a[i][j-k]) //在前i门课上花j天得到的最大分数,等于max(在前i-1门 ...
- 动态规划——线性dp
我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...
- POJ 2479-Maximum sum(线性dp)
Maximum sum Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33918 Accepted: 10504 Des ...
- poj 1050 To the Max(线性dp)
题目链接:http://poj.org/problem?id=1050 思路分析: 该题目为经典的最大子矩阵和问题,属于线性dp问题:最大子矩阵为最大连续子段和的推广情况,最大连续子段和为一维问题,而 ...
- nyoj44 子串和 线性DP
线性DP经典题. dp[i]表示以i为结尾最大连续和,状态转移方程dp[i] = max (a[i] , dp[i - 1] + a[i]) AC代码: #include<cstdio> ...
- 『最大M子段和 线性DP』
最大M子段和(51nod 1052) Description N个整数组成的序列a[1],a[2],a[3],-,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M &g ...
- 『最长等差数列 线性DP』
最长等差数列(51nod 1055) Description N个不同的正整数,找出由这些数组成的最长的等差数列. 例如:1 3 5 6 8 9 10 12 13 14 等差子数列包括(仅包括两项的不 ...
随机推荐
- for循环语句示例
for循环语句示例 一判断/var/目录下所有文件的类型 完整脚本 [root@centos73 ~]# cat shell_scripts/filetype.sh #!/bin/bash #Auth ...
- 【NOIP2019模拟11.01】Game(贪心+线段树)
Description: 小 A 和小 B 在玩一个游戏,他们两个人每人有
- Ubuntu下Arm-Linux-GCC交叉编译环境的搭建
1.下载arm-linux-gcc-3.4.1.tar.bz2到临时的目录下. 2.解压 arm-linux-gcc-3.4.1.tar.bz2 #tar -jxvf arm-linux-gcc-3. ...
- [CSP-S模拟测试]:工业题/a(数学)
题目传送门(内部题39) 输入格式 第一行:四个正整数$n$.$m$.$a$.$b$.第二行:$n$个正整数,第$i$个表示$f(i,0)$.第三行:$m$个正整数,第$i$个表示$f(0,i)$. ...
- 泰坦尼克号沉没之谜,用数据还原真相——Titanic获救率分析(用pyecharts)
泰坦尼克号获救率数据分析报告,用数据揭露真相. 一,船上乘客生存率分析报告 泰坦尼克号生存率仅有38%的,可见此次事件救援不力,救生艇严重不足,且泰坦尼克号号撞得是冰山,海水冷,没有救生艇,在水里冻死 ...
- cent OS 7 下安装 python 3.6
step1:安装依赖环境 # yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readli ...
- sql格式化工具推荐
还在为上百行甚至上千行冗余的sql烦恼吗?这里推荐一款在线美化sql的工具 工具地址:http://www.matools.com/sql 怎么样,黑屏界面是不是带有满满的黑科技感? 该工具支持ora ...
- HTML5: HTML5 介绍
ylbtech-HTML5: HTML5 介绍 1. 什么是 HTML5?返回顶部 HTML5 是下一代 HTML 标准. HTML,HTML 4.01的上一个版本诞生于1999年.自从那儿以后, ...
- Autofac框架详解 转载https://www.cnblogs.com/lenmom/p/9081658.html
一.组件 创建出来的对象需要从组件中来获取,组件的创建有如下4种(延续第一篇的Demo,仅仅变动所贴出的代码)方式: 1.类型创建RegisterType AutoFac能够通过反射检查一个类型,选择 ...
- 力扣算法——142LinkedListCycleII
Given a linked list, return the node where the cycle begins. If there is no cycle, return null. To r ...