bzoj3379
区间dp
好神
看上去没有思路,因为觉得完成没有顺序,没有明显的转移顺序,转移的时候没办法记录之前已经完成哪些,那么转移就不能保证任务全部完成。但是我们发现其实没完成的任务一定是一段连续的区间,那么我们就可以进行区间dp,dp[i][j][0/1]表示当前未完成的区间是[i,j],现在正在完成i或j,0是i,1是j,花费的最小时间,最终答案就是dp[i][i][0/1]+dis(i,B),转移比较简单,0和1分别两种情况讨论
以前某道树形dp也是觉得选择的东西不一定连续,很难dp,最终证明选择的肯定是连续的一段,然后就可以进行区间dp,所以当我们看见这种由于选择方式奇怪而不能直接像背包一样dp的,或者是可以不连续选择而需要dp的题目,可以考虑证明选择的东西一定是连续的一段,然后进行区间dp或者其他dp
#include<bits/stdc++.h>
using namespace std;
const int N = ;
struct data {
int pos, t;
bool friend operator < (const data &a, const data &b) {
return a.pos < b.pos;
}
} a[N];
int n, len, end;
int dp[N][N][];
int main()
{
scanf("%d%d%d", &n, &len, &end);
for(int i = ; i <= n; ++i) scanf("%d%d", &a[i].pos, &a[i].t);
sort(a + , a + n + );
memset(dp, 0x3f3f, sizeof(dp));
dp[][n][] = max(a[].pos, a[].t);
dp[][n][] = max(a[n].pos, a[n].t);
for(int i = ; i <= n; ++i)
for(int j = n; j >= i; --j)
{
dp[i][j][] = min(dp[i][j][], max(dp[i - ][j][] + a[i].pos - a[i - ].pos, a[i].t));
dp[i][j][] = min(dp[i][j][], max(dp[i][j + ][] + a[j + ].pos - a[i].pos, a[i].t));
dp[i][j][] = min(dp[i][j][], max(dp[i - ][j][] + a[j].pos - a[i - ].pos, a[j].t));
dp[i][j][] = min(dp[i][j][], max(dp[i][j + ][] + a[j + ].pos - a[j].pos, a[j].t));
}
int ans = 0x3f3f3f3f;
for(int i = ; i <= n; ++i) ans = min(ans, min(dp[i][i][], dp[i][i][]) + abs(a[i].pos - end));
printf("%d\n", ans);
return ;
}
bzoj3379的更多相关文章
- 【BZOJ3379】[Usaco2004 Open]Turning in Homework 交作业 DP
[BZOJ3379][Usaco2004 Open]Turning in Homework 交作业 Description 贝茜有C(1≤C≤1000)门科目的作业要上交,之后她要去坐巴士和奶 ...
- 【BZOJ3379】【USACO2004】交作业 区间DP
题目描述 数轴上有\(n\)个点,你要从位置\(0\)去位置\(B\),你每秒钟可以移动\(1\)单位.还有\(m\)个限制,每个限制\((x,y)\)表示你要在第\(t\)秒之后(可以是第\(t\) ...
- 【BZOJ3379】[Usaco2004 Open]Turning in Homework 交作业
题解: 比较容易想到二分答案+时间逆流 这样就变成了经典的路灯问题 f[a][b][0/1] 其实可以不用二分答案 根据倒着考虑我们会发现一定是先走旁边的再走中间的 计算到当前点+下课时间所需的最小时 ...
- 【bzoj3379】[Usaco2004 Open]Turning in Homework 交作业 区间dp
题目描述 数轴上有C个点,每个点有一个坐标和一个访问时间,必须在这个时间后到达这个点才算访问完成.可以在某个位置停留.每在数轴上走一个单位长度消耗一个单位的时间,问:访问所有点并最终到B花费的最小时间 ...
- [BZOJ3379] Turning in Homework
中文题目:提交作业 原文题目:Turning in Homework 传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3379 哎,今天竟然没有 ...
- 区间dp提升复习
区间\(dp\)提升复习 不得不说这波题真的不简单... 技巧总结: 1.有时候转移可以利用背包累和 2.如果遇到类似区间添加限制的题可以直接把限制扔在区间上,每次只考虑\([l,r]\)被\([i, ...
随机推荐
- 识别SQL Server 性能杀手
性能优化的重点在于识别定位问题,预先了解主要的性能杀手,能够更快的定位到问题并将工作集中在可能的原因之上. SQL SERVER性能杀手主要集中在如下几类: 1.1 低质量的索引 低质量的索引通常 ...
- SQL视图优化改写为存储过程遇到 双引号 单引号问题
核心在于拼接SQL字符串中遇到中文双引号问题: 可以使用系统函数 替换掉set @pageStr = replace(@queryStr,'"','''') 不过更推荐 使用两个单 ...
- java内部类理解使用
这是我学习Java内部类的笔记 1.为什么使用内部类?使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响1.1 ...
- WIN7实现多用户远程桌面
版权声明:本文为博主原创文章,未经博主允许不得转载. 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://jonnyqin.blog. ...
- VisualSVN Server 导入已存在的库
http://blog.csdn.net/lidatgb/article/details/7984220 早些时候建立过一个SVN Server的库,后来觉得库的名字太长了,随意换了一 ...
- SolidEdge 装配体中如何快速的搞定一个面上所有螺丝 如何在装配体上进行阵列
1 点击"规则排列" 选择要排列的螺丝 2 选择被规则排列的架子 3 选择所有的圆孔(鼠标滑到任意圆孔位置,左键单击即可选中所有圆孔) 4 选择参考的基准孔(已经上了螺 ...
- 零售连锁行业SOA化解决方式
零售连锁行业面临的问题 1.店铺老化.营销手段单一落后. 2.管理模式的不科学,我国零售企业在起家时候并没有一套完好的科学的管理及考评系统的存在.而且在企业的发展过程中并未学习建立.对于人才的吸引.培 ...
- QVector的内存分配策略
我们都知道 STL std::vector 作为动态数组在所分配的内存被填满时.假设继续加入数据,std::vector 会另外申请一个大小当前容量两倍的区域(假设 n > size 则申请 n ...
- 第二种BitBand操作的方式 - 让IDE来帮忙算地址
要使用Bitband来訪问外设,一定要得出相应的映射地址.人工计算肯定是不靠谱的,并且也没人想这么干.因此能够通过Excel,拉个列表来计算.想想,这也是一个不错的招数.可是后来想想,还是嫌麻烦,毕竟 ...
- Leetcode41: Remove Duplicates from Sorted List
Given a sorted linked list, delete all duplicates such that each element appear only once. For examp ...