TOJ4587:抓苹果(DP)

 传送门:抓苹果

dp(i,j) = max(dp(i-1,j-1),dp(i-1,j))+当i这分钟时能否刚好移动到这棵树下.

初始化是对不移动的情况下。

代码

#include<bits/stdc++.h> 
using namespace std;
#define LL long long
#define INF 2000000000
#define eps 1e-8
#define pi  3.141592653589793 
int dp[1001][31];//第i分钟移动j次得到的最多苹果 
int main()
{
    int a[1001];
    memset(dp,0,sizeof(dp));
    int n,m;
    scanf("%d %d",&n,&m);
    for(int i = 1 ; i <= n ; i ++)scanf("%d",a+i);
    for(int i = 1 ; i <= n ; i++) dp[i][0] = dp[i-1][0]+(a[i]==1);
    //初始化,因为刚开始在1这棵树,按不移动(j==0)推状态 
    for(int i = 1 ; i <= n ; i ++){
        for(int j = 1 ; j <= m ; j++){
            dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+(a[i]==j%2+1);
            //从上个状态的最大值再加上是否站的位置刚好有苹果
            // 最初在1这个树下,移动奇数次能到2这棵树,移动偶数次能回到1这棵树 
            // 所以如果a[i]是j%2+1,即刚好在这棵树下,代表ta能接到苹果 
        }
    }
    int ans = 0;
    for(int i = 0  ; i <= m ; i++){
        ans = max(ans,dp[n][i]);
    }
    printf("%d\n",ans);
}
/*
7 2 
2 
1 
1 
2 
2 
1 
1
*/

猜你喜欢

转载自www.cnblogs.com/Esquecer/p/10853912.html