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 */