Peng Lv

毋意,毋必,毋固,毋我。 言必行,行必果。

导航

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;
}

 

posted on 2010-03-15 18:00  Lvpengms  阅读(521)  评论(0编辑  收藏  举报