洛谷 P2690 [USACO04NOV] Apple Catching G
记忆化
#include <cstdio> //头文件
#include <iostream>
#include <cstring>
using namespace std;
int T, w;
short a[1009];
int f[1005][3][31]; //记忆化的三维数组记录dfs
int dfs(int i,int j,int k) //i为时间点,j为哪棵树,k为移动了多少次
{
if (i > T)return 0;//边界条件
if (f[i][j][k] != -1)
return f[i][j][k]; //如果搜过了就直接返回
int tmp1 = 0, tmp2 = 0; //两种决策 移动或者不移动
if (k < w && a[i] != j) //最优化剪枝:如果在这个时间点里,当前位置会有果子落下,就不走
tmp1 = dfs(i + 1, -1 * j + 3, k + 1) + 1; //-1 * j + 3这里表示移动,你可以把1,2代进去算一下
tmp2 = dfs(i + 1, j, k) + (j == a[i]); //移动
return f[i][j][k] = max(tmp1, tmp2);
}
int main()
{
cin >>T>>w;
for (int i = 1; i <= T; i++)
cin >> a[i];
memset(f, -1, sizeof(f));//初始化
cout << dfs(1, 1, 0); //开始从时间1,初始在第一棵树,移动次数
}