JOISC 2014 邮戳拉力赛(基础DP)
题意
思路
真的神仙题,想到就很好写,想不到就写不出来。
肯定只能一个一个邮戳按顺序分析。首先,将取一枚邮戳的路径分为四种:
- 上行 \(\rightarrow\) 邮戳台 \(\rightarrow\) 上行 简称路径 \((U,V)\)
- 上行 \(\rightarrow\) 邮戳台 \(\rightarrow\) 下行 简称路径 \((U,E)\)
- 下行 \(\rightarrow\) 邮戳台 \(\rightarrow\) 下行 简称路径 \((D,E)\)
- 下行 \(\rightarrow\) 邮戳台 \(\rightarrow\) 上行 简称路径 \((D,V)\)
取一枚邮戳也就这四种路径。
但我们发现,路径 \((D,V)\) 的出现前提是有路径 \((U,E)\) 在前面出现过,也就是说到任意一个点路径 \((U,E)\) 的条数总是多余路径 \((D,V)\) 。也是说,我们可以将 \((U,E)\) 的条数减 \((D,V)\) 的条数当 \(\text{dp}\) 的第二维,也就是还未抵消的 \((U,E)\) 路径。另外 \((D,V)\) 路径出现的条件为至少有一个还未抵消的 \((U,E)\) 路径。
那么转移就是上述的四种,一个 \(O(n^3)\) 的暴力很快就能出来了
chk_min(dp[i][j],dp[i-1][j]+u+v);
if(j>0)chk_min(dp[i][j],dp[i-1][j]+d+e);
FOR(k,1,j)chk_min(dp[i][j],dp[i-1][j-k]+(d+v)*k);
FOR(k,1,n-j)chk_min(dp[i][j],dp[i-1][j+k]+(u+e)*k);
dp[i][j]+=(ll)T*(2*j+1); //计算j个(D,V)路径的贡献
不难发现后面两维可以直接前后缀优化,或者背包转移,复杂度就优化至 \(O(n^2)\) 了。
代码
#include<bits/stdc++.h>
#define FOR(i,x,y) for(int i=(x),i##END=(y);i<=i##END;++i)
#define DOR(i,x,y) for(int i=(x),i##END=(y);i>=i##END;--i)
using namespace std;
template<typename T,typename _T>inline bool chk_min(T &x,const _T y){return y<x?x=y,1:0;}
template<typename T,typename _T>inline bool chk_max(T &x,const _T y){return x<y?x=y,1:0;}
typedef long long ll;
const int N=3005;
ll dp[N][N],f[N],g[N];
int n,T;
int main()
{
scanf("%d%d",&n,&T);
memset(dp,0x3f,sizeof(dp));
dp[0][0]=0;
FOR(i,1,n)
{
int u,v,d,e;
scanf("%d%d%d%d",&u,&v,&d,&e);
FOR(j,0,n)f[j]=g[j]=dp[i-1][j];
FOR(j,1,n)chk_min(f[j],f[j-1]+(d+v));
DOR(j,n-1,0)chk_min(g[j],g[j+1]+(u+e));
FOR(j,0,n)
{
chk_min(dp[i][j],dp[i-1][j]+u+v);
if(j>0)chk_min(dp[i][j],dp[i-1][j]+d+e);
// FOR(k,1,j)chk_min(dp[i][j],dp[i-1][j-k]+(d+v)*k);
// FOR(k,1,n-j)chk_min(dp[i][j],dp[i-1][j+k]+(u+e)*k);
if(j>0)chk_min(dp[i][j],f[j-1]+(d+v));
if(j<n)chk_min(dp[i][j],g[j+1]+(u+e));
dp[i][j]+=(ll)T*(2*j);
}
}
printf("%lld\n",dp[n][0]+(n+1)*T);
return 0;
}
JOISC 2014 邮戳拉力赛(基础DP)的更多相关文章
- 【bzoj4244】邮戳拉力赛 背包dp
题目描述 IOI铁路是由N+2个站点构成的直线线路.这条线路的车站从某一端的车站开始顺次标号为0...N+1. 这条路线上行驶的电车分为上行电车和下行电车两种,上行电车沿编号增大方向行驶,下行电车沿编 ...
- 【BZOJ4244】邮戳拉力赛 DP
[BZOJ4244]邮戳拉力赛 Description IOI铁路是由N+2个站点构成的直线线路.这条线路的车站从某一端的车站开始顺次标号为0...N+1. 这条路线上行驶的电车分为上行电车和下行电车 ...
- 基础dp
队友的建议,让我去学一学kuangbin的基础dp,在这里小小的整理总结一下吧. 首先我感觉自己还远远不够称为一个dp选手,一是这些题目还远不够,二是定义状态的经验不足.不过这些题目让我在一定程度上加 ...
- 基础DP(初级版)
本文主要内容为基础DP,内容来源为<算法导论>,总结不易,转载请注明出处. 后续会更新出kuanbin关于基础DP的题目...... 动态规划: 动态规划用于子问题重叠的情况,即不同的子问 ...
- [BZOJ4244]邮戳拉力赛
Description IOI铁路是由N+2个站点构成的直线线路.这条线路的车站从某一端的车站开始顺次标号为0...N+1. 这条路线上行驶的电车分为上行电车和下行电车两种,上行电车沿编号增大方向行驶 ...
- hdu 5586 Sum 基础dp
Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Desc ...
- hdu 4055 Number String (基础dp)
Number String Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- 训练指南 UVA - 10917(最短路Dijkstra + 基础DP)
layout: post title: 训练指南 UVA - 10917(最短路Dijkstra + 基础DP) author: "luowentaoaa" catalog: tr ...
- 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP)
layout: post title: 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP) author: "luowentaoaa" catalog: true ...
随机推荐
- Python 6 -- 构建一个Web应用
用Flask Web框架,实现浏览器页面交互.在此之前需要了解web的基本工作流程,可参照https://blog.csdn.net/m0_37466453/article/details/72752 ...
- 使用Python中的config配置
Python中有ConfigParser类,可以很方便的从配置文件中读取数据(如DB的配置,路径的配置),所以可以自己写一个函数,实现读取config配置. config文件的写法比较简单,[sect ...
- Linux基础命令---ipcalc计算IP
ipcalc ipcalc提供了一种计算主机IP信息的简单方法.各种选项指定ipcalc应该在标准输出上显示什么信息.可以指定多个选项.必须始终指定要操作的IP地址.大多数操作还需要一个 ...
- git log的常见用法
git log 使用git log命令,什么参数都没有的话,会以下面的格式输出所有的日志(我当前的git仓库只有三个提交).如果日志特别多的话,在git bash中,按向下键来查看更多,按q键退出查看 ...
- 自学Java第七周的总结
这一周里我将看过的知识点又复习了一遍,下个星期打算将题做一遍
- kali linux常用软件配置记录
首先膜一波,认真细致,简明有效. 感谢原博主的分享,留作参考. https://www.cnblogs.com/youfang/p/5272746.html
- Python进阶【第十篇】模块(上)
·一.模块 模块就是一组功能的集合体,我们的程序可以导入模块来复用模块里的功能.为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这 ...
- Tomcat启动程序端口冲突、确认相应进程及杀死冲突进程的解决方案
一. 查看所有进程占用的端口 在开始-运行-cmd,输入:netstat –ano可以查看所有进程 二.查看占用指定端口的程序(1)命令窗口输出 命令:netstat –ano | findstr & ...
- 如何将OpenCV中的Mat类绑定为OpenGL中的纹理
https://blog.csdn.net/TTTTzTTTT/article/details/53456324 如果要调用外接的USB摄像头获取图像通常使用OpenCV来调用,如何调用摄像头请参考本 ...
- AngularJS之登录显示用户名
效果图:在这里会显示出来用户名 使用AngularJs进行这样效果 第一步:写ng-app // 定义模块: var app = angular.module("pinyougou" ...