POJ 2385 Apple Catching (DP)
题意:牛Bessie可以在两棵苹果树之间来回走,在连续的一段时间内,每分钟都从两棵树之间掉苹果,但同一分钟只有一棵树掉,Bessie一分钟只能在一棵树下接苹果,问在规定的步数之内,Bessie最多可以吃掉多少苹果。
思路:此题用动态规划思想考虑,在第m次移动后,在t分钟所获得的苹果是根据第m-1次移动第t-1分钟 和 第m次移动第t-1分钟决定的。记f[m][t]为第m次移动t分钟时所获得的最大的数量,那么会有如下公式:
f[m][t] = max{f[m-1][t-1],f[m][t-1]}+x,x是这时Bessie所在的棵树的那个时间的苹果,如果有,那么x=1,否则为0。
#include <iostream>
#include <cstdio>
#include <memory.h>
#include <algorithm>
using namespace std;
#define MAXN 10000
int main()
{
int m,n,i,j,f[50][MAXN],arr[MAXN],tmp;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i = 1; i <= n; ++i)
scanf("%d",&arr[i]);
memset(f,0,sizeof(f));
for(i = 1; i <= m+1; ++i)
{
for(j = 1; j <= n; ++j)
{
tmp = f[i-1][j-1]>f[i][j-1]?
f[i-1][j-1]:f[i][j-1];
if(i&1)
f[i][j] = tmp+(arr[j]&1);
else
f[i][j] = tmp+((arr[j]&1)^1);
}
}
printf("%d\n",f[m+1][n]>f[m][n]?f[m+1][n]:f[m][n]);
}
return 0;
}