区间dp - 全部按下一列石头
There is one last gate between the hero and the dragon. But opening the gate isn't an easy task.
There were n buttons list in a straight line in front of the gate and each with an integer on it. Like other puzzles the hero had solved before, if all buttons had been pressed down in any moment, the gate would open. So, in order to solve the puzzle, the hero must press all the button one by one.
After some trials, the hero found that those buttons he had pressed down would pop up after a while before he could press all the buttons down. He soon realized that the integer on the button is the time when the button would automatic pop up after pressing it, in units of second. And he measured the distance between every button and the first button, in units of maximum distance the hero could reach per second. Even with this information, the hero could not figure out in what order he should press the buttons. So you talent programmers, are assigned to help him solve the puzzle.
To make the puzzle easier, assuming that the hero always took integral seconds to go from one button to another button and he took no time turnning around or pressing a button down. And the hero could begin from any button.
The input file would contain multiple cases. Each case contains three lines. Process to the end of file.
The first line contains a single integer n(1 ≤ n ≤200), the number of buttons.
The second line contains n integers T1, T2, ..., Tn, where Ti(1 ≤ Ti ≤ 1,000,000) is the time the ith button would automatic pop up after pressing it, in units of second.
The third line contains n integers D1, D2, ..., Dn, where Di(1 ≤ Di ≤ 1,000,000) is the time hero needed to go between the ith button and the first button, in units of second. The sequence will be in ascending order and the first element is always 0.
Output
Output a single line containing n integers which is the
sequence of button to press by the hero. If there are multiply
sequences, anyone will do. If there is no way for the hero to solve the
puzzle, just output "Mission Impossible"(without quote) in a single
line.
Sample Input
2
4 3
0 3
2
3 3
0 3
4
5 200 1 2
0 1 2 3
Sample Output
1 2
Mission Impossible
1 2 4 3
Hint
In the second sample, no matter which button the hero pressed first, the button would always pop up before he press the other button. So there is no way to make all the button pressed down.
题意:有一列石头,只有全部按下的时候才能打开大门,可以任意选择按下的起点,但是每个石头还有一个隔一段会弹起的时间,问是否存在一种方案可以打开大门。
思路分析:
首先这个人如果可以成功打开石门的按下的方案一定是每次都是从左侧或右侧去按,不然你先中间按下一次,但是它的左侧或右侧还有没按的,这时如果再回去按,那么先按的中间的这个显然时间会变长,因此是不可取的。
类似送外卖那个问题,dp[i][j][0]表示送完区间(i, j)后此人位于区间的左侧,dp[i][j][1]表示位于右侧,那么就可以得到处理完全部区间后最优的时间,但是在求的过程要判断一下当前扩展出来的区间的是否是满足题目要求的,同时记录一下路径,最后倒着往回想一下就可以了。
代码示例:
int n;
int t[205], d[205];
int dp[205][205][2];
int path[205][205][2]; int main() {
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout); while(~scanf("%d", &n)){
for(int i = 1; i <= n; i++) scanf("%d", &t[i]);
for(int i = 1; i <= n; i++) scanf("%d", &d[i]); memset(dp, 0, sizeof(dp));
for(int len = 2; len <= n; len++){
for(int i = 1; i <= n; i++){
int j = i+len-1;
if (j > n) break;
if (dp[i+1][j][0]+d[i+1]-d[i] <= dp[i+1][j][1]+d[j]-d[i]){
dp[i][j][0] = dp[i+1][j][0]+d[i+1]-d[i];
path[i][j][0] = 0;
}
else {
dp[i][j][0] = dp[i+1][j][1]+d[j]-d[i];
path[i][j][0] = 1;
}
if (t[i] <= dp[i][j][0]) dp[i][j][0] = inf; if (dp[i][j-1][1]+d[j]-d[j-1] <= dp[i][j-1][0]+d[j]-d[i]){
dp[i][j][1] = dp[i][j-1][1]+d[j]-d[j-1];
path[i][j][1] = 1;
}
else {
dp[i][j][1] = dp[i][j-1][0]+d[j]-d[i];
path[i][j][1] = 0;
}
if (t[j] <= dp[i][j][1]) dp[i][j][1] = inf;
}
} int tem;
int l = 1, r = n;
if (dp[1][n][0] < inf){
printf("1");
tem = path[1][n][0];
l++;
}
else if (dp[1][n][1] < inf){
printf("%d", n);
tem = path[1][n][1];
r--;
}
else {printf("Mission Impossible\n"); continue;} while(l <= r){
if (tem == 0){
tem = path[l][r][0];
printf(" %d", l++);
}
else{
tem = path[l][r][1];
printf(" %d", r--);
}
}
printf("\n");
}
return 0;
}
区间dp - 全部按下一列石头的更多相关文章
- 区间DP(力扣1000.合并石头的最低成本)
一.区间DP 顾名思义区间DP就是在区间上进行动态规划,先求出一段区间上的最优解,在合并成整个大区间的最优解,方法主要有记忆化搜素和递归的形式. 顺便提一下动态规划的成立条件是满足最优子结构和无后效性 ...
- LightOJ1031 Easy Game(区间DP)
我可能真想不到这题是区间DP,不过知道是区间DP想了下就AC了. dp[i][j]表示局面为ai...aj先手能获得与后手得分的最大差值 那么转移到当前状态就是枚举中间的位置,分成两边,其中一边先手全 ...
- 区间dp总结篇
前言:这两天没有写什么题目,把前两周做的有些意思的背包题和最长递增.公共子序列写了个总结.反过去写总结,总能让自己有一番收获......就区间dp来说,一开始我完全不明白它是怎么应用的,甚至于看解题报 ...
- [BZOJ 1652][USACO 06FEB]Treats for the Cows 题解(区间DP)
[BZOJ 1652][USACO 06FEB]Treats for the Cows Description FJ has purchased N (1 <= N <= 2000) yu ...
- 区间DP(总结)
学长一晚上的耐心讲解,使我明白区间DP这么高级的东西,还是挺容易的.也就是在一段区间内的动态规划. 下面用例题进行总结. 例题:石子归并. 描述 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石 ...
- 区间DP小结
也写了好几天的区间DP了,这里稍微总结一下(感觉还是不怎么会啊!). 但是多多少少也有了点感悟: 一.在有了一点思路之后,一定要先确定好dp数组的含义,不要模糊不清地就去写状态转移方程. 二.还么想好 ...
- 洛谷P1514 引水入城 [搜索,区间DP]
题目传送门 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个 N 行×M 列的矩形,如上图所示,其中每个格子都代表一座城市,每 ...
- 区间DP【p2858】[USACO06FEB]奶牛零食Treats for the Cows
Description 约翰经常给产奶量高的奶牛发特殊津贴,于是很快奶牛们拥有了大笔不知该怎么花的钱.为此,约翰购置了N(1≤N≤2000)份美味的零食来卖给奶牛们.每天约翰售出一份零食.当然约翰希望 ...
- 简单Dp----最长公共子序列,DAG最长路,简单区间DP等
/* uva 111 * 题意: * 顺序有变化的最长公共子序列: * 模板: */ #include<iostream> #include<cstdio> #include& ...
随机推荐
- 央行下属的上海资信网络金融征信系统(NFCS)签约机构数量突破800家
央行下属的上海资信网络金融征信系统(NFCS)签约机构数量突破800家 ——已接入NFCS的P2P网贷机构将优先 接入央行征信系统 P2P网贷行业的健康发展依赖于信用体系的支撑和保障,加快完善适应 ...
- Linux 内核总线
一个总线是处理器和一个或多个设备之间的通道. 为设备模型的目的, 所有的设备都通过 一个总线连接, 甚至当它是一个内部的虚拟的,"平台"总线. 总线可以插入另一个 - 一个 USB ...
- 解决netcore在docker容器中连接oracle报错(timezone region not found)
错误提示: timezone region not found错误原因:docker 容器内时区不是 CST 导致解决办法:1.在dockerfile 中增加一下命令ENV TZ=Asia/Shang ...
- LeetCode111_求二叉树最小深度(二叉树问题)
题目: Given a binary tree, find its minimum depth.The minimum depth is the number of nodes along the s ...
- Keras mlp 手写数字识别示例
#基于mnist数据集的手写数字识别 #构造了三层全连接层组成的多层感知机,最后一层为输出层 #基于Keras 2.1.1 Tensorflow 1.4.0 代码: import keras from ...
- SSI(服务器端嵌入)
简介 SSI(服务器端嵌入)是一组放在 HTML 页面中的指令,当服务器向客户端访问提供这些页面时,会解释执行这些指令.它们能为已有的 HTML 页面添加动态生成内容,不需要通过 CGI 程序来或其他 ...
- Java方法的参数传递是值传递还是引用传递?
当基本数据类型(Boolean,byte,char,String,int,Long,float,double)作为参数传递时,传递的是实参值的副本,即传的是值,无论在函数中怎么操作这个副本,实参的值是 ...
- 【学习】调用iframe中的方法
当页面中有iframe时,想在主页面调用iframe中的方法,可以用contentWindow属性.但具体用时还有一点要注意,就是必须等页面加载完成才可以,否则会报错找不到函数. 例: 父页面: &l ...
- $Noip2014/Luogu1351$ 联合权值 树形
$Luogu$ $Description$ 给定一棵树,每两个距离为$2$的点之间可以产生"联合权值","联合权值"定义为这两个数的乘积.求最大的联合权值以及所 ...
- selenium自动化测试入门 Alert/Confirm/Prompt 弹出窗口处理
一.Alert/Confirm/Prompt弹出窗口特征说明 Alert弹出窗口: 提示用户信息只有确认按钮,无法通过页面元素定位,不关闭窗口无法在页面上做其他操作. Confirm 弹出窗口: 有确 ...