题意:蜘蛛侠可以上下跳,问如何跳可以使得达到的最高高度尽可能小。并且最后的位置要在地面。

解题思路:首先记录跳的所有高度和sum,蜘蛛侠所能达到的最高高度肯定在1-sum之间(否则不可能做到),标准的二分模型。同时dp[i][j]表示第i次跳到高度为j是否可行。所以dp[i][j]是一个bool变量。这里的状态方程比较好处理,详见代码。求出最小的高度,剩下的就是用dfs去搜索路径,最开始以为会超时,结果1A。。爽!!

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;const int maxn = 100;
int n,ans,height[maxn];
char path[maxn];
bool dp[maxn][1005],flag;bool check(int len)
{memset(dp,false,sizeof(dp));dp[1][height[1]] = true;for(int i = 1; i < n; i++)for(int j = 0; j <= len; j++){if(dp[i][j] == false) continue;if(j + height[i+1] <= len)dp[i+1][j+height[i+1]] = true;if(j - height[i+1] >= 0)dp[i+1][j-height[i+1]] = true;}return dp[n][0];
}void dfs(int cur,int len)
{if(flag) return;if(cur == n){if(len - height[cur] != 0) return;for(int i = 1; i < n; i++)printf("%c",path[i]);printf("D\n");flag = true;return;}if(len + height[cur] <= ans){path[cur] = 'U';dfs(cur+1,len + height[cur]);}if(len - height[cur] >= 0){path[cur] = 'D';dfs(cur+1,len - height[cur]);}
}int main()
{int t;scanf("%d",&t);while(t--){scanf("%d",&n);int sum = 0;for(int i = 1; i <= n; i++){scanf("%d",&height[i]);sum += height[i];}int l = 0, r = sum, mid;ans = -1, flag = false;while(l <= r){mid = (l + r) >> 1;if(check(mid)){ans = mid;r = mid - 1;}else l = mid + 1;}if(ans == -1)printf("IMPOSSIBLE\n");else dfs(1,0);}return 0;
}

poj 2397(二分+dp)相关推荐

  1. 【bzoj1044】[HAOI2008]木棍分割 二分+dp

    题目描述 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长度最小, 并且 ...

  2. POJ - 2018 二分+单调子段和

    依然是学习分析方法的一道题 求一个长度为n的序列中的一个平均值最大且长度不小于L的子段,输出最大平均值 最值问题可二分,从而转变为判定性问题:是否存在长度大于等于L且平均值大于等于mid的字段和 每个 ...

  3. Fire (poj 2152 树形dp)

    Fire (poj 2152 树形dp) 给定一棵n个结点的树(1<n<=1000).现在要选择某些点,使得整棵树都被覆盖到.当选择第i个点的时候,可以覆盖和它距离在d[i]之内的结点,同 ...

  4. Drying POJ - 3104 二分

    Drying    POJ - 3104  二分      http://poj.org/problem?id=3104 二分查找作用之一:查找结果,逆向求解. 最让HSQ学长头疼的就是洗衣服了.洗完 ...

  5. POJ 3579 二分答案

    POJ 3579 二分答案 文章目录 POJ 3579 二分答案 题目 思路 代码 题目 思路 排序,二分一下答案,然后对于每一个元素看一看加上这个答案tmp之后,在数列里面排在哪里,比a[i]+tm ...

  6. POJ 图论分类 + DP(较全 自己又加了点)

    DP -----------动态规划 状态压缩DP 2411 (棋盘规模较大)状态压缩DP+DFS+滚动数组 2664 (棋盘规模较小)直接递推即可(DP) 2506 (棋盘规模较小)直接递推即可(D ...

  7. POJ 2096 (概率DP)

    题目链接: http://poj.org/problem?id=2096 题目大意:n种bug,s个子系统.每天随机找一个bug,种类随机,来自系统随机.问找齐n种bug,且每个子系统至少有一个bug ...

  8. hdu1025 Constructing Roads In JGShining#39;s Kingdom(二分+dp)

    转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1025 Problem ...

  9. POJ 2955 (区间DP)

    题目链接: http://poj.org/problem?id=2955 题目大意:括号匹配.对称的括号匹配数量+2.问最大匹配数. 解题思路: 看起来像个区间问题. DP边界:无.区间间隔为0时,默 ...

最新文章

  1. AjaxControltoolkit(工具包)安装步骤说明
  2. linux 压缩 解压 命令大全
  3. mybatis第一讲:初探mybatis实现简单的查询
  4. python库整理:collections.defaultdict
  5. python with语句与contextlib
  6. 委托、事件的个人理解
  7. 如何破解您忘记的Windows密码
  8. [C#]struct如何支持虚方法覆盖和接口继承
  9. eclipse git 取远程代码_IDEA中的Git操作,看这一篇就够了!
  10. 高评分防火墙GlassWire:帮你监控、追踪和提升电脑安全
  11. css制作俄罗斯方块,H5原创俄罗斯方块(基于canvas)
  12. 一阶广义差分模型_计量经济学习题第5章 自相关性
  13. Image Segmentation
  14. 界面设计基础之基本窗口
  15. 时序分析 45 -- 时序数据转为空间数据 (四) 格拉姆角场 python 实践 (下)
  16. 光纤通信系统组成总结及相干光通信基础
  17. RK3399平台开发系列讲解(应用开发篇)1.12、RTC闹钟唤醒
  18. Python 下opencv 应用: 摄像头参数设置
  19. 聊聊我当年在培训学校做开发的经历
  20. 软件系统复杂性灾难及解决方案探究

热门文章

  1. 神策数据 App 可视化全埋点 2.0 重磅升级!抢先体验
  2. 产品迭代的道与术,爆款产品的打造密码 | 周四话产品
  3. 算法学习--买卖股票的最佳时机
  4. Modbus网口设备接入多比物联网云平台教程
  5. Crontab命令格式
  6. 【搬砖】【Python数据分析】Pycharm中plot绘图不能显示出来
  7. Linux/Centos服务器安装portsentry防恶意端口扫描
  8. JavaScript通过RegExp实现客户端验证
  9. 网络学习(二十七)Windows XP 加入 Windows Server 2003 Active Directory
  10. English as a medium of instruction