Apple Catching
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 11050 | Accepted: 5373 |
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.
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.
* 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.
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
题目链接:http://poj.org/problem?id=3661
题目意思:有两棵树在落苹果,落t次(1表示1树落,2表示2树落).而牛要在苹果落地之前接住苹果,问奶牛在最多来回w次能接住多少个苹果(奶牛最先在1树下)
题目思路:明显的动态规划题目,dp[i][j]表示第i次奶牛已经来回j次,那么不考虑当前是否吃到苹果则有:dp[i][j] = max(dp[i-1][j], dp[i-1][j-1]),再考虑当前状态:如果奶牛来回偶数次则在1树下,奇数次在2树下,那么则有dp[i][j] = max(dp[i-1][j], dp[i-1][j-1]) + (tree[i] == (j%2)+1);
for循环版:
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
int dp[1005][35];
int tree[1005];
int main(){
int t, w;
scanf("%d%d", &t, &w);
for(int i = 0; i < 35; i++)
dp[0][i] = 0;
for(int i = 1; i <= t; i++){
scanf("%d", &tree[i]);
dp[i][0] = dp[i-1][0] + (tree[i] == 1);
}
for(int i = 1; i <= w; i++){
for(int j = 1; j <= t; j++){
dp[j][i] = max(dp[j-1][i-1], dp[j-1][i]) + (tree[j] == (i%2)+1);
}
}
printf("%d\n", dp[t][w]);
return 0;
}
dfs版
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int dp[1005][35];
int tree[1005];
void init(){
memset(dp, -1, sizeof(dp));
for(int i = 0; i < 35; i++)
dp[0][i] = 0;
}
int dfs(int x, int y){
if(~dp[x][y]) return dp[x][y];
int& res = dp[x][y];
res = max(dfs(x-1, y), dfs(x-1, y-1));
if(tree[x] == (y%2)+1) res++;
return res;
}
int main(){
int t, w;
scanf("%d%d", &t, &w);
init();
for(int i = 1; i <= t; i++){
scanf("%d", &tree[i]);
dp[i][0] = dp[i-1][0] + (tree[i] == 1);
}
printf("%d\n", dfs(t, w));
return 0;
}