Apple Catching POJ - 2385

vampire-lh發表於2018-09-03
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[2][31];//在第i棵樹時,步數為j時取的最大蘋果數//0代表第一棵樹,1代表第二棵樹; 
int a[1001];
int main()
{
   int treenumber,step;
   int pos;
   int ans=0;
    memset(dp,0,sizeof(dp));
    scanf("%d%d",&treenumber,&step);
    for(int i=0;i<treenumber;i++)
    {
        scanf("%d",&a[i]);
    }
    for(int i=0;i<treenumber;i++)
    {
        if(i==0)
        {
        if(a[0]==1)//牛開始站在第一棵樹下,如果蘋果開始是從第一棵樹下落下的根據dp陣列的定義 
        dp[0][0]=1;// 第一棵樹下不移動,接到的最大蘋果數目為1; 
        else if(a[0]==2)//如果蘋果開始是從第二棵樹上落下,那麼牛需要從第一棵樹移動到第二棵樹、 
        dp[1][1]=1;//接到的蘋果數目為1; 
        continue;

        }
       for(int j=step;j>=0;j--)
       {
        if(j)
        dp[a[i]-1][j]=max(dp[a[i]-1][j],dp[a[i]%2][j-1])+1;//這裡的 dp[a[i]-1][j]+1表示這隻牛沒有移動 
        else                                              // 並且接到了1個蘋果,dp[a[i]%2][j-1]+1表示 
        dp[a[i]-1][j]++;                                  //牛移動從另外一棵樹下,移動到當前樹下接到1個蘋果 
        if(dp[a[i]-1][j]>ans)
        ans=dp[a[i]-1][j];
       }
    }
    printf("%d\n",ans);
}