bzoj1750 [Usaco2005 qua]Apple Catching
2014-07-20 22:50
381 查看
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 22
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
6OUTPUT 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/2 int 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吧
相关文章推荐
- BZOJ1750: [Usaco2005 qua]Apple Catching
- BZOJ[1750/3384]: [Usaco2005 qua]Apple Catching
- BZOJ 3384: [Usaco2004 Nov]Apple Catching 接苹果/BZOJ 1750: [Usaco2005 qua]Apple Catching dp
- bzoj1750 [Usaco2005 qua]Apple Catching
- 1750: [Usaco2005 qua]Apple Catching (动态规划)
- bzoj1752 [Usaco2005 qua]Til the Cows Come Home
- bzoj1751 [Usaco2005 qua]Lake Counting
- bzoj1752 [Usaco2005 qua]Til the Cows Come Home
- bzoj 1751 [Usaco2005 qua]Lake Counting
- [bzoj1751][Usaco2005 qua]Lake Counting
- 【BZOJ】1754: [Usaco2005 qua]Bull Math
- bzoj1753 [Usaco2005 qua]Who's in the Middle
- bzoj1754 [Usaco2005 qua]Bull Math
- BZOJ1753 [Usaco2005 qua]Who's in the Middle
- bzoj1753 [Usaco2005 qua]Who's in the Middle
- bzoj1753 [Usaco2005 qua]Who's in the Middle
- BZOJ 1755 [USACO 2005 Qua] Bank Interest 快速幂
- bzoj1754 [Usaco2005 qua]Bull Math
- bzoj 1755: [Usaco2005 qua]Bank Interest【模拟】
- bzoj1754 [Usaco2005 qua]Bull Math