如题:http://poj.org/problem?id=2385
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 8318 | Accepted: 4071 |
Description
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
* Lines 2..T+1: 1 or 2: the tree that will drop an apple each minute.
Output
Sample Input
7 2 2 1 1 2 2 1 1
Sample Output
6
Hint
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
dp中递推关系的寻找和边界条件,初始值的考虑一点点都不能有误。要多花时间练习了。
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 8318 | Accepted: 4071 |
Description
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
* Lines 2..T+1: 1 or 2: the tree that will drop an apple each minute.
Output
Sample Input
7 2 2 1 1 2 2 1 1
Sample Output
6
Hint
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
题目大意:有2棵树1,2 每一个时间点有一棵树会掉下一个苹果,你可以再树中间转移W次,从1到2,或从2到1.要求求出最多能拿到的苹果数量。
注意:1.W次不需要全部用完
2.一开始在树1下面(T=0)
思路:一开始的思路是使用3维数组dp[i][j][k]表示在i时间,转了j次且当前在标号k的树下的苹果数,dp[i][j][k]=max(dp[i-1][j][k],dp[i-1][j-1][(k+1)%2]),然后通过判断a[i]==k,则当前时间点k树下有苹果dp[i][j][k]++.
之后想了想,k根本没必要。
dp[i][j]表示在i时间转了j次的苹果数.通过转移的次数就可以判断当前在哪棵树,k就没有必要了。
dp[i][j]=max(dp[i-1][j-1],dp[i-1][j]),通过判断a[i]-1%2==j,dp[i][j]++;
i 1~T
j 0~W
注意对转的次数为0,也就是j为0时特殊处理。dp[i][j]=dp[i-1][j]+a[i]%2
#include<iostream>
#include<cstdio>
using namespace std;
#define max(a,b)(a>b?a:b)
int dp[1005][35];
int a[1005];
int main()
{
// freopen("C:\\1.txt","r",stdin);
int T,W;
scanf("%d%d",&T,&W);
int i,j;
for(i=1;i<=T;i++)
scanf("%d",&a[i]);
for(i=1;i<=T;i++)
for(j=0;j<=W;j++)
{
if(j==0)
{
dp[i][j]=dp[i-1][j]+a[i]%2;
}
else
{
dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]);
if(a[i]-1==j%2)
dp[i][j]++;
}
}
int max=-0x0fffffff;
for(i=0;i<=W;i++)
if(max<dp[T][i])
max=dp[T][i];
printf("%d\n",max);
}