首页 > 代码库 > POJ 2385 Apple Catching

POJ 2385 Apple Catching

题目链接:http://poj.org/problem?id=2385

 

思路:动规题目。dp[i][j]表示第i分钟还可以移动j次的最大接到苹果的值。

    转移方程 :1.当前位置与苹果要下落的位置一致时dp[i][j] = max(dp[i-1][j]+1,dp[i-1][j-1])

         2.当前位置与苹果要下落的位置不一致时dp[i][j] = max(dp[i-1][j],dp[i-1][j-1]+1)

          还要注意当j为0时就不可以移动的情况,分离出来

代码:

  

#include <iostream>#include <cstring>using namespace std;int dp[1001][31];int a[1001];int main(){    int n,s;    int res;        while(cin>>n>>s)    {        memset(dp,0,sizeof(dp));            for(int i=1;i<=n;i++)        {            cin>>a[i];            for(int j = 0;j<=s;j++)            {                if((s-j) % 2 +1 ==a[i])                {                    if(j==0)                        dp[i][j] = dp[i-1][j]+1;                    else                        dp[i][j] = max(dp[i-1][j]+1,dp[i-1][j-1]);                }                else                 {                    if(j==0)                        dp[i][j] = dp[i-1][j];                    else                        dp[i][j] = max(dp[i-1][j],dp[i-1][j-1]+1);                }            }        }        res = 0;        for(int i=0;i<=s;i++)        {            res = res>dp[n][i]?res:dp[n][i];        }                cout<<res<<endl;    }    return 0;}