POJ_2385_Apple_Catching_(动态规划)
2016-04-23 18:23
423 查看
描述
http://poj.org/problem?id=2385
两棵苹果树,给定一个时间t,1~t每分钟有一棵树掉苹果,牛起始在#1树,最多换w次位置,问最多接到多少苹果.
Apple Catching
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 10522 | Accepted: 5106 |
Description
It is a little known fact that cows love apples. Farmer John has two apple trees (which are conveniently numbered 1 and 2) in his field, each full of apples. Bessie cannot reach the apples when they are on the tree, so she must wait for them to fall. However, she must catch them in the air since the apples bruise when they hit the ground (and no one wants to eat bruised apples). Bessie is a quick eater, so an apple she does catch is eaten in just a few seconds.Each minute, one of the two apple trees drops an apple. Bessie, having much practice, can catch an apple if she is standing under a tree from which one falls. While Bessie can walk between the two trees quickly (in much less than a minute), she can stand under only one tree at any time. Moreover, cows do not get a lot of exercise, so she is not willing to walk back and forth between the trees endlessly (and thus misses some apples).
Apples fall (one each minute) for T (1 <= T <= 1,000) minutes. Bessie is willing to walk back and forth at most W (1 <= W <= 30) times. Given which tree will drop an apple each minute, determine the maximum number of apples which Bessie can catch. Bessie starts at tree 1.
Input
* Line 1: Two space separated integers: T and W* Lines 2..T+1: 1 or 2: the tree that will drop an apple each minute.
Output
* Line 1: The maximum number of apples Bessie can catch without walking more than W times.Sample Input
7 2 2 1 1 2 2 1 1
Sample Output
6
Hint
INPUT DETAILS:Seven apples fall - one from tree 2, then two in a row from tree 1, then two in a row from tree 2, then two in a row from tree 1. Bessie is willing to walk from one tree to the other twice.
OUTPUT DETAILS:
Bessie can catch six apples by staying under tree 1 until the first two have dropped, then moving to tree 2 for the next two, then returning back to tree 1 for the final two.
Source
USACO 2004 November分析
用f[i][j][k]表示第i分钟,已经移动了j次,在#k树下的最优解.
注意:
1.有些时候动规写成+的形式比-的形式方便
#include<cstdio> #include<algorithm> using std :: max; const int maxt=1005,maxw=35; int t,w; int tree[maxt],f[maxt][maxw][3]; inline int move(int x) { return x== 1 ? 2: 1; } void solve() { int ans=1; for(int i=1;i<t;i++) { for(int j=0;j<=w;j++) { for(int k=1;k<=2;k++) { if(k==tree[i+1]) { f[i+1][j][k]=max(f[i+1][j][k],f[i][j][k]+1); f[i+1][j+1][move(k)]=max(f[i+1][j+1][move(k)],f[i][j][k]); } else { f[i+1][j][k]=max(f[i+1][j][k],f[i][j][k]); f[i+1][j+1][move(k)]=max(f[i+1][j+1][move(k)],f[i][j][k]+1); } } } } for(int i=1;i<=t;i++) { for(int j=0;j<=w;j++) { for(int k=1;k<=2;k++) { ans=max(ans,f[i][j][k]); } } } printf("%d\n",ans); } void init() { scanf("%d%d",&t,&w); for(int i=1;i<=t;i++) { scanf("%d",tree+i); } if(tree[1]==1) f[1][0][1]=1; else f[1][1][2]=1; } int main() { #ifndef ONLINE_JUDGE freopen("apple.in","r",stdin); freopen("apple.out","w",stdout); #endif init(); solve(); #ifndef ONLINE_JUDGE fclose(stdin); fclose(stdout); #endif return 0; }View Code
相关文章推荐
- Android开发艺术探索——第三章View事件体系读书笔记
- 安卓等边三角形
- Android 根据包名,获取应用程序的签名
- 移动端与PHP服务端接口通信流程设计(基础版)
- [django]安装配置grappelli
- Android中的Bitmap
- Cocos2d-x:裁剪节点圆角矩形(将节点处理成圆角)
- iOS APP提交上架最新流程
- Y3_01_关于专业技能
- Cocos2dx: 使用ClippingNode的节点裁剪
- ios struct property
- 自定义FlowLayout,支持多种布局优化--android-flowlayout
- Android邮件发送详解
- 判断app是否是第一次进入
- Android百度地图开发(二):显示地图界面
- Android系统自带样式 @android:style
- Android学习(40) -- 自定义控件(4)广告轮播(ViewPager)
- Android SensorManager分析
- 搭建Android底层开发环境
- Android自定义最简单的dialog