这道题目虽然不难,但是还是算很经典的动态规划题目了。
题意很简单,两颗苹果树每一分会有树落下苹果,有人去接,但是来回两个树之间的次数是一定的,所以求出在最大次数时最多能接到多少苹果。
状态方程一开始是想对了,但是还是有些细节没有注意啊。
比如:开始的时候在tree1下面,这样如果给出显示第2颗树落下苹果的话,初始化代码就得改变,所以分两种情况。
另外就是dp状态方程dp[i][j] = max(dp[i-1][j], dp[i-1][j-1])
dp[i][j]标示在时间i,已经来回了j次时的最大苹果数目。
这样dp方程肯定苹果数目不会变的,所以要注意,如果当前的次数刚到当前树下,dp[i][j]++;
见代码:
#include <cmath>
#include <algorithm>
#include <vector>
#include <iostream>
#include <string.h>
using namespace std;
const double EPS=1E-8;
typedef vector<double> vec;
typedef vector<vec> mat;
int arr[1111];
int dp[1111][33];
int main()
{
int T,W;
while(cin>>T>>W)
{
memset(arr,0,sizeof(arr));
memset(dp,0,sizeof(dp));
for(int i=1;i<=T;i++)
cin>>arr[i];
if(arr[1]==1)
{
dp[1][0]=1;
dp[1][1]=0;
}
else
{
dp[1][1]=1;
dp[1][0]=0;
}
for(int i=2;i<=T;i++)
{
for(int j=0;j<=W;j++)
{
if(j==0)
{
dp[i][j]=dp[i-1][j]+arr[i]%2;
continue;
}
dp[i][j]=max(dp[i-1][j-1],dp[i-1][j]);
if(j%2+1==arr[i])
dp[i][j]++;
}
}
int maxn=0;
for(int i=1;i<=T;i++)
for(int j=0;j<=W;j++)
maxn=max(maxn,dp[i][j]);
cout<<maxn<<endl;
}
}