区间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的更多相关文章

  1. 【BZOJ3379】[Usaco2004 Open]Turning in Homework 交作业 DP

    [BZOJ3379][Usaco2004 Open]Turning in Homework 交作业 Description     贝茜有C(1≤C≤1000)门科目的作业要上交,之后她要去坐巴士和奶 ...

  2. 【BZOJ3379】【USACO2004】交作业 区间DP

    题目描述 数轴上有\(n\)个点,你要从位置\(0\)去位置\(B\),你每秒钟可以移动\(1\)单位.还有\(m\)个限制,每个限制\((x,y)\)表示你要在第\(t\)秒之后(可以是第\(t\) ...

  3. 【BZOJ3379】[Usaco2004 Open]Turning in Homework 交作业

    题解: 比较容易想到二分答案+时间逆流 这样就变成了经典的路灯问题 f[a][b][0/1] 其实可以不用二分答案 根据倒着考虑我们会发现一定是先走旁边的再走中间的 计算到当前点+下课时间所需的最小时 ...

  4. 【bzoj3379】[Usaco2004 Open]Turning in Homework 交作业 区间dp

    题目描述 数轴上有C个点,每个点有一个坐标和一个访问时间,必须在这个时间后到达这个点才算访问完成.可以在某个位置停留.每在数轴上走一个单位长度消耗一个单位的时间,问:访问所有点并最终到B花费的最小时间 ...

  5. [BZOJ3379] Turning in Homework

    中文题目:提交作业 原文题目:Turning in Homework 传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3379 哎,今天竟然没有 ...

  6. 区间dp提升复习

    区间\(dp\)提升复习 不得不说这波题真的不简单... 技巧总结: 1.有时候转移可以利用背包累和 2.如果遇到类似区间添加限制的题可以直接把限制扔在区间上,每次只考虑\([l,r]\)被\([i, ...

随机推荐

  1. 你知道在springboot中如何使用WebSocket吗

    一.背景   我们都知道 http 协议只能浏览器单方面向服务器发起请求获得响应,服务器不能主动向浏览器推送消息.想要实现浏览器的主动推送有两种主流实现方式: 轮询:缺点很多,但是实现简单 webso ...

  2. 二叉树的层次遍历 II

    给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 ...

  3. java通过反射获取bean字段注解@Column中的信息

    直接上代码吧: Field field; Field[] fields=clas.getDeclaredFields(); for (int i = 0; i <fields.length ; ...

  4. ImportError: No module named _curses;Color support is disabled, python-curses is not installed.解决办法

    linux系统默认安装了python2.6, 但是发现python2.7 import curses时 提示 找不到_curses 错误.  用pip(python2.7 )安装了curses-204 ...

  5. 使用图片作为textview组件的背景

    <TextView android:layout_gravity="center" android:layout_width="100dp" androi ...

  6. 前端编程提高之旅(十)----表单验证插件与cookie插件

        实际项目开发中与用户交互的常见手法就是採用表单的形式.取得用户注冊.登录等信息.而当用户注冊或登录后又须要记住用户的登录状态.这就涉及到经常使用的两个操作:表单验证与cookie增删查找.   ...

  7. [cocos2d-x]怎样降低cocos2d-x游戏的耗电量?

    Cocos2d-x游戏的耗电量一直是个让人头疼的问题,一个简单的三消游戏,玩一会手机就热得发烫,更郁闷的是电池消耗非常快.基本上两个小时就能够把电池耗光. 近期又看到一个帖子.有个老外用cocos2d ...

  8. LZMA C# SDK 结合 UPK 打包压缩 多目录 Unity3d实例

    上篇  LZMA C# SDK 子线程压缩与解压缩 Unity3d实例  讲了怎样使用 LZMA C# SDK 来对文件进行压缩与解压,当中提到 对于多目录能够先打包成 UPK 然后再 LZMA 压缩 ...

  9. 关于Widget预览图的改动

    在做项目时候,由于常常不带GPS功能.所以在有些细节上须要做处理,当中之中的一个就是.快捷开关的预览图和实际效果图的差异 在我们快捷开关的预览图中,总是能够看到五个快捷开关,事实上就包含GPS信息 而 ...

  10. OpenStack源码系列---nova-conductor

    nova-conductor启动的也是一个rpc server,代码框架和nova-compute类似,所以我也懒得再详细分析一遍服务启动的过程.nova-api那篇文章的最后我说"cctx ...