bzoj1750 [Usaco2005 qua]Apple Catching
来源:互联网 发布:mac使用的音乐播放器 编辑:程序博客网 时间:2024/06/05 01:05
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
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.
Sample Output
6
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.
题意是一个人站在树下接苹果,树只有两棵,每一个时刻只有一棵树有苹果掉下来,但是人只能从一棵树移到另一棵树最多m次,求最多能接多少个苹果
dp太水了,f[i][j][0 / 1]表示第i时刻已经移动了j次,当前在第1 / 2棵树下的方案,然后转移自己yy一下吧。或者直接看代码
#include<cstdio>inline int max(int a,int b){return a>b?a:b;}inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}int n,m,mx;int f[1001][1001][2];//Ç° i ¸ö¡¢Òƶ¯ j ²½¡¢µ±Ç°Î»ÖÃÊÇ1/2int a[1001][2];int main(){scanf("%d%d",&n,&m);for (int i=1;i<=n;i++){int x=read();a[i][x-1]=1;}for (int i=1;i<=n;i++){ f[i][0][0]=f[i-1][0][0]+a[i][0]; f[i][0][1]=f[i-1][0][1]+a[i][1]; for (int j=1;j<=m;j++) { f[i][j][0]=max(f[i-1][j-1][1],f[i-1][j][0])+a[i][0]; f[i][j][1]=max(f[i-1][j-1][0],f[i-1][j][1])+a[i][1]; mx=max(mx,f[i][j][0]); mx=max(mx,f[i][j][1]); }}printf("%d\n",mx);}
然后我再想了下,好像我们把相邻的相同的数字缩成一个数,用缩掉的数字的个数表示,然后求长度为m+1的最大子串和
比如样例:
7 2
2|1 1|2 2|1 1缩成1 2 2 2
然后显然答案是2 2 2即6
但是有反例
7 2
1 2 1 2 1 2 2
答案是5,这样做是4
我想不用多解释了吧
所以还是老老实实dp吧
0 0
- bzoj1750 [Usaco2005 qua]Apple Catching
- 1750: [Usaco2005 qua]Apple Catching (动态规划)
- BZOJ[1750/3384]: [Usaco2005 qua]Apple Catching
- BZOJ 3384: [Usaco2004 Nov]Apple Catching 接苹果/BZOJ 1750: [Usaco2005 qua]Apple Catching dp
- Apple Catching
- Apple Catching
- Apple Catching
- bzoj1754 [Usaco2005 qua]Bull Math
- bzoj1755 [Usaco2005 qua]Bank Interest
- 1755: [Usaco2005 qua]Bank Interest
- bzoj1751 [Usaco2005 qua]Lake Counting
- bzoj1755 [Usaco2005 qua]Bank Interest
- bzoj1751 [Usaco2005 qua]Lake Counting
- bzoj1754: [Usaco2005 qua]Bull Math
- [bzoj1751][Usaco2005 qua]Lake Counting
- bzoj1755 [Usaco2005 qua]Bank Interest
- bzoj1754 [Usaco2005 qua]Bull Math
- 1754: [Usaco2005 qua]Bull Math (高精度乘法)
- Ubuntu下搭建tftp服务器最简单方法
- 东软实训(二十一)
- HDOJ 1018 Big Number
- 关于韩语博客专栏的说明
- 解析ELF 运行结果
- bzoj1750 [Usaco2005 qua]Apple Catching
- tag branch trunk
- linux中关于创建子进程系统堆栈的分析
- 程序员在实战中的蜕变
- jQuery获取节点和子节点文本
- STL_map——map::end
- 产品经理必知:如何做一个优秀的互联网产品
- RadioGroup和RadioButton
- 解决:hibernate+mysql中文查询不出结果,SQL语句也正常