洛谷 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,初始在第一棵树,移动次数 
}

 

posted @ 2023-07-25 16:33  浪矢-CL  阅读(36)  评论(0编辑  收藏  举报