Codeblocks 574D,DP
2015-08-31 22:07
162 查看
题意:
给出n摞箱子,它们紧挨着放在一起,现在有如下操作:每轮,每次把暴露的箱子拿去(对于暴露的定义:左、右、上三个面中,只要有一个面没跟箱子挨着,则暴露),问,经过多少轮后,箱子被拿光。
数据范围:箱子数量0<n<=10^5,箱子高度0<h<=10^9。
分析:
每轮,一摞箱子受到的影响,h[i]=max(h[i-1],h[i]-1,h[i+1]),拿光它,需要的操作轮数:num[i]=min(num[i-1]+1,h[i],num[i+1]+1)。
每摞箱子被拿光总共有三种方式:
①左边箱子拿光了;dp[i]=dp[i-1]+1;
②右边箱子拿光了;dp[i]=dp[i+1]+1;
③或者是因为自己顶面暴露,而被每次拿一个,最后拿光;dp[i]=h[i];
实现过程,只需正序DP一次,逆序DP一次。
具体实现代码:
给出n摞箱子,它们紧挨着放在一起,现在有如下操作:每轮,每次把暴露的箱子拿去(对于暴露的定义:左、右、上三个面中,只要有一个面没跟箱子挨着,则暴露),问,经过多少轮后,箱子被拿光。
数据范围:箱子数量0<n<=10^5,箱子高度0<h<=10^9。
分析:
每轮,一摞箱子受到的影响,h[i]=max(h[i-1],h[i]-1,h[i+1]),拿光它,需要的操作轮数:num[i]=min(num[i-1]+1,h[i],num[i+1]+1)。
每摞箱子被拿光总共有三种方式:
①左边箱子拿光了;dp[i]=dp[i-1]+1;
②右边箱子拿光了;dp[i]=dp[i+1]+1;
③或者是因为自己顶面暴露,而被每次拿一个,最后拿光;dp[i]=h[i];
实现过程,只需正序DP一次,逆序DP一次。
具体实现代码:
#include<cstdio> #include<algorithm> #include<iostream> #include<vector> using namespace std; #define N 100010 typedef long long LL; int dp ,h ,n; int main() { while(scanf("%d",&n)!=EOF) { h[0]=0; for(int i=1;i<=n;i++) { scanf("%d",&h[i]); } dp[0]=0; for(int i=1;i<=n;i++) { dp[i]=min(h[i],dp[i-1]+1); } dp[n+1]=0; int ans=0; for(int i=n;i>0;i--) { dp[i]=min(dp[i],dp[i+1]+1); ans=max(ans,dp[i]); } cout<<ans<<endl; } return 0; }
相关文章推荐
- RS485总线最多可以负载多少个设备
- 修复 Tween.JS 的 onStop 设置无效
- HTML5拖放API
- 网络编程
- 使用 Math 类操作数据
- Servlet中操作Oracle数据库
- hdoj 3820 Golden Eggs 【双二分图构造最小割模型】
- DesignPattern_Java:Composite Pattern
- /sys/class/gpio 文件接口操作IO端口(s3c2440)
- HDU - 5116(计数dp)
- 从现在开始我要做一个幸福的人——记英语
- 惠普之旅-在这个夏天正式起航!
- 数据库设计(7)-概念数据建模
- cocos2d-js 事件交互
- Consuming a RESTful Web Service
- 【转】使用AIDL实现进程间的通信之复杂类型传递
- Android ImageView图片透明区域不响应点击事件,不规则图片透明区域响应点击事件
- [转]XML::Parser perl module is required for intltool错误
- ubuntu下tftp的安装、配置、使用
- spring 的 resource接口概览