ZOJ3541:The Last Puzzle(区间DP)
来源:互联网 发布:东芝财务造假数据分析 编辑:程序博客网 时间:2024/05/22 17:43
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.
Input
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
24 30 323 30 345 200 1 20 1 2 3
Sample Output
1 2Mission Impossible1 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][k]表示把i,j全部按下花费的时间,k=0表示停在i,k=1表示停在j,再开个next进行路径记录,跟ZOJ3469类似
#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#define up(i,x,y) for(i=x;i<=y;i++)#define down(i,x,y) for(i=x;i>=y;i--)#define mem(a,b) memset(a,b,sizeof(a))#define w(x) while(x)#define ss(x) scanf("%d",&x)const int inf = 1<<30;int dp[205][205][2],t[205],d[205],next[205][205][2];int main(){ int i,j,k,l,n; w(~scanf("%d",&n)) { up(i,1,n) ss(t[i]); up(i,1,n) ss(d[i]); mem(dp,0); up(l,2,n) { up(i,1,n-l+1) { j=i+l-1; dp[i][j][0]=min(dp[i+1][j][0]+d[i+1]-d[i],dp[i+1][j][1]+d[j]-d[i]); next[i][j][0]=(dp[i+1][j][0]+d[i+1]-d[i]>=dp[i+1][j][1]+d[j]-d[i]); if(dp[i][j][0]>=t[i] || dp[i][j][0]>inf) dp[i][j][0]=inf; dp[i][j][1]=min(dp[i][j-1][1]+d[j]-d[j-1],dp[i][j-1][0]+d[j]-d[i]); next[i][j][1]=(dp[i][j-1][0]+d[j]-d[i]>=dp[i][j-1][1]+d[j]-d[j-1]); if(dp[i][j][1]>=t[j] || dp[i][j][1]>inf) dp[i][j][1]=inf; } } int l,r,m; if(dp[1][n][0]<inf) { l=2,r=n,m=next[1][n][0]; printf("1"); } else if(dp[1][n][1]<inf) { l=1,r=n-1,m=next[1][n][1]; printf("%d",n); } else printf("Mission Impossible"); while(l<=r) { if(m==0) { printf(" %d",l); m=next[l][r][m]; l++; } else { printf(" %d",r); m=next[l][r][m]; r--; } } printf("\n"); } return 0;}
- 区间dp-zoj3541-The Last Puzzle
- ZOJ3541:The Last Puzzle(区间DP)
- ZOJ3541-The Last Puzzle 区间dp
- 【ZOJ3541】The Last Puzzle 区间DP+贪心
- zoj 3541 The Last Puzzle 区间dp
- UVALive 5695 -The Last Puzzle -区间dp
- ZOJ 3541-The Last Puzzle(区间DP)
- HDU 4053 or ZOJ 3541 The Last Puzzle 区间dp
- Zoj 3541 The Last Puzzle(区间dp)
- ZOJ 3541 - The Last Puzzle(区间dp)
- zoj3541(区间dp)
- zoj3541(区间dp+贪心)
- HDU 4053 or ZOJ 3541 The Last Puzzle【区间dp】【经典题】
- ZOJ3541与时间相关的区间dp+记录路径
- poj1651Multiplication Puzzle 区间dp
- POJ1651Multiplication Puzzle(区间dp)
- zoj 3541 The Last Puzzle
- ZOJ 3541 The Last Puzzle
- ZooKeeper通过Auth和ACL完成节点的权限控制。
- CH Round #48 - Streaming #3 (NOIP模拟赛Day1)
- IT忍者神龟之oracle常用日期计算
- tomcat数据源的配置和使用
- opencv2.1移植arm 出现找不到libcv.so not found (try using -rpath or -rpath-link) 及大量 undefined reference的解决
- ZOJ3541:The Last Puzzle(区间DP)
- 六、Sketchup用ruby进行二次开发--创建球体
- LINUX的目录树
- Java序列化Serializable和Externalizable
- 并归排序的实现和简单分析
- NOIP2014提高组模拟题 8.9
- Linux驱动学习——I2C
- 王家林最受欢迎的一站式云计算大数据和移动互联网解决方案课程 V1(20140809)之HTML5端云整合:智能端应用与云端服务整合开发实战
- poj 3468 A Simple Problem with Integers(线段树的区间更新与求和)