题目链接
两棵苹果树,每棵树在某个时间落下一个苹果,然后可以移动w次,问t秒内可以拿到多少
这里定义一个dp数组,因为可以移动w次,那么移动的就是第一棵树,第二棵树,第一个树,第二课树的来回移动,所以我们的dp数组dpi表示在时间i内第j次移动后能得到的最多的果实
那么转移方程就是
dpi = max(dpi - 1,dpi - 1);
前一个时间内的移动和不移动的最大值
当然这没有完,因为我们还要算当前的这个位置会不会落下苹果
那么j代表第几次转移也代表我们在那颗树下,因为我们一共两棵树,那么j%2+1表示的就是我们在那棵树下,如果a[i]=j%2+1那么刚好我们在这个时间内可以得到这个拼过,所以我们就加一
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int t, w;
cin >> t >> w;
int a[1010];
for (int i = 1; i <=t; i++) {
cin >> a[i];
}
int dp[1010][1010];//表示前i次时间内,第j次转最大的数
if (a[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++) {
dp[i][j] = max(dp[i - 1][j],dp[i - 1][j - 1]);
if (a[i] == j % 2 + 1) {
dp[i][j]++;
}
}
}
int res = -1;
for (int i = 0; i <= w; i++) {
if (res < dp[t][i]) {
res = dp[t][i];
}
}
cout << res << endl;
return 0;
}