题目链接:

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3541

题目大意:

在数轴上,有n个按钮,位置递增为d1,d2,..dn,每个按钮对应一个时间为t1,t2,...tn.每次每个按钮按下后,t1秒后会自动弹起来。每走单位距离花费单位时间,问以怎样的顺序按,能够保证所有 的按钮都能够被按下去。

解题思路:

区间dp.

这题hdu 4053提交过不了,spj可能有问题。

对于某一区间A~B的按钮,一定是先按某个端点,如果不是,假设先按中间的K,然后肯定要按一个端点,再之后会按另外一个端点,中间肯定会经过K点,所以先按k不如后按k。

dp[i][j][0]表示在区间i~j内先按左边端点能达到的最小的时间,dp[i][j][1]表示先按右端点能达到的最小时间。

dp[i][j][0]=Min(dp[i+1][j][0]+dp[i+1]-dp[i],dp[i+1][j]+dp[j][-dp[i]);

path[i][j][]表示对应状态表示的端点(左还是右)。

代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF 0x3fffffff
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std; //freopen("data.in","r",stdin);
//freopen("data.out","w",stdout); #define Maxn 220 ll dp[Maxn][Maxn][2];
int pa[Maxn][Maxn][2];
//dp[i][j][0]表示区间i~j从左边端点开始按 dp[][][1]表示从右边端点开始
//path[i][j][k]表示与之对应的状态。
int ti[Maxn],di[Maxn];
int n; int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d",&ti[i]);
for(int i=1;i<=n;i++)
scanf("%d",&di[i]);
memset(dp,0,sizeof(dp)); //时间为0
for(int gap=2;gap<=n;gap++)
{
for(int i=1;i+gap-1<=n;i++)
{
int j=i+gap-1; if(dp[i+1][j][0]+di[i+1]-di[i]<dp[i+1][j][1]+di[j]-di[i])
{
dp[i][j][0]=dp[i+1][j][0]+di[i+1]-di[i];
pa[i][j][0]=0;//表示从左边过来
}
else
{
dp[i][j][0]=dp[i+1][j][1]+di[j]-di[i];
pa[i][j][0]=1;//表示从右边走
}
if(ti[i]<=dp[i][j][0]||dp[i][j][0]>=INF)
dp[i][j][0]=INF; if(dp[i][j-1][1]+di[j]-di[j-1]<=dp[i][j-1][0]+di[j]-di[i])
{
dp[i][j][1]=dp[i][j-1][1]+di[j]-di[j-1];
pa[i][j][1]=1; //从右边
}
else
{
dp[i][j][1]=dp[i][j-1][0]+di[j]-di[i];
pa[i][j][1]=0;//从左边
}
if(ti[j]<=dp[i][j][1]||dp[i][j][1]>=INF)
dp[i][j][1]=INF; //置为无效状态
}
}
int l,r,va;
if(dp[1][n][0]<INF) //有效状态
{
printf("%d",1);
l=2,r=n;
va=pa[1][n][0];
}
else if(dp[1][n][1]<INF)
{
printf("%d",n);
l=1,r=n-1;
va=pa[1][n][1];
}
else
{
printf("Mission Impossible\n");
continue;
}
while(l<=r)
{
if(va==0)
{
printf(" %d",l);
va=pa[l][r][0];
l++;
}
else
{
printf(" %d",r);
va=pa[l][r][1];
r--;
}
}
putchar('\n');
}
return 0;
}

区间dp-zoj3541-The Last Puzzle的更多相关文章

  1. Poj 1651 Multiplication Puzzle(区间dp)

    Multiplication Puzzle Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10010   Accepted: ...

  2. POJ 1651 Multiplication Puzzle(类似矩阵连乘 区间dp)

    传送门:http://poj.org/problem?id=1651 Multiplication Puzzle Time Limit: 1000MS   Memory Limit: 65536K T ...

  3. [ZOJ]3541 Last Puzzle (区间DP)

    ZOJ 3541 题目大意:有n个按钮,第i个按钮在按下ti 时间后回自动弹起,每个开关的位置是di,问什么策略按开关可以使所有的开关同时处于按下状态 Description There is one ...

  4. 区间dp E - Multiplication Puzzle POJ - 1651

    E - Multiplication Puzzle  POJ - 1651 这个题目没有特别简单,但是也没有我想象之中的那么难,这个题目时区间dp,因为我们是要对区间进行考虑的. 但是呢,这个也和动态 ...

  5. POJ1651Multiplication Puzzle(区间DP)

    比较好做的区间DP 状态转移方程:DP[i][j] 表示区间[i,j]最小的乘积和. DP[i][j] = MIN{DP[i][k-1]+DP[k+1][j] + a[k]*a[i-1]*a[j+1] ...

  6. ZOJ 1602 Multiplication Puzzle(区间DP)题解

    题意:n个数字的串,每取出一个数字的代价为该数字和左右的乘积(1.n不能取),问最小代价 思路:dp[i][j]表示把i~j取到只剩 i.j 的最小代价. 代码: #include<set> ...

  7. POJ 1651 Multiplication Puzzle (区间DP,经典)

    题意: 给出一个序列,共n个正整数,要求将区间[2,n-1]全部删去,只剩下a[1]和a[n],也就是一共需要删除n-2个数字,但是每次只能删除一个数字,且会获得该数字与其旁边两个数字的积的分数,问最 ...

  8. POJ 1651:Multiplication Puzzle(区间DP)

    http://poj.org/problem?id=1651 题意:给出n个数字,每取中间一个数,就会使得权值加上中间这个数和两边的乘积,求取剩两个数最少的权值是多少. 思路:区间dp. 一开始想了挺 ...

  9. HDU5900 QSC and Master(区间DP + 最小费用最大流)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...

  10. 2016 年沈阳网络赛---QSC and Master(区间DP)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5900 Problem Description Every school has some legend ...

随机推荐

  1. 【JAVA】使用Eclipse依赖生成jar包时,避免最外层同时生成资源文件的配置。

    使用Eclipse依赖生成jar包时,如果做配置,生成的jar包文件会全部生成在外面,这并不是我们需要的,下面我们一起来修改下配置,使生成的jar包符合我们的需求吧. 1.如果不做任何配置生成的jar ...

  2. 使用RadioGroup与RadioButton实现多选一

    RadioGroup是RadioButton的集合, RadioGroup里面可以包含很多RadioButton,提供多选一机制,只能选择其中一个 RadioGroup的orientation(方向) ...

  3. C++类的封装_工程

    一个C++工程 main.cpp #include<stdio.h> #include"Array.h" int main(){     Array a1(10); f ...

  4. 纯css画哆啦A梦

    今天有点无聊,照着网上的图写了个哆啦A梦,无技术可言,纯考耐心. <!doctype html> <html lang="en"> <head> ...

  5. UIView 设置阴影(属性说明)

    以下代码实现: 第一个图片的代码 //加阴影--任海丽编辑 _imageView.layer.shadowColor = [UIColor blackColor].CGColor;//shadowCo ...

  6. IT资源专业搜索-www.easysoo.cn

    创始人:samrthhl 时间:2015-11-8 关于易搜 易搜(www.easysoo.cn)是一个面向IT开发从业人员的专业资源搜索站点,它将全球的知名博客论坛.专业IT行业站点.知名咨询机构和 ...

  7. Introduction to Json

    什么是Json 是Javascript·对象的一种表示,属于轻量级数据,它比XMl小,快,易解析 作用: 用于存储和交换(转换)信息的语言,还可以将各种数据类型放在json中并进行数据传输 整理的章节 ...

  8. git 代理设置

    git 代理设置: git config --global http.proxy http://proxy.com:8080git config --global https.proxy http:/ ...

  9. 和S5933比较起来,开发PLX9054比较不幸,可能是第一次开发PCI的缘故吧。因为,很多PCI的例子都是对S5933,就连微软出版的《Programming the Microsoft Windows Driver Model》都提供了一个完整的S5933的例子。 在这篇有关DDK的开发论文里。

    和S5933比较起来,开发PLX9054比较不幸,可能是第一次开发PCI的缘故吧.因为,很多PCI的例子都是对S5933,就连微软出版的<Programming the Microsoft Wi ...

  10. hadoop源代码解读namenode高可靠:HA;web方式查看namenode下信息;dfs/data决定datanode存储位置

    点击browserFilesystem,和命令查看结果一样 当我们查看hadoop源代码时,我们看到hdfs下的hdfs-default.xml文件信息 我们查找${hadoop.tmp.dir}这是 ...