题解 CF132C 【Logo Turtle】

Sakurajima_Mai

2019-03-16 00:55:05

题解

1. 如果为F

  1. 如果当k为奇数的时候,就是相当于变化了1步,所以F就变成T了,那么他的方向也因此变化了。所以当前的方向一定和上一步(也就是i - 1时的方向)的方向相反,所以有dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j - k][1]),

    同理,

    dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j - k][0])
  2. 如果k为偶数,相当于没有变化,所以还是字符F,如果是正方向,那么他就可以由上一步继续向正方向走一步,也就是加1, 如果是负方向,相当于往回走一步,距离就减1,

    递推方程为:dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j - k][0] + 1);

    dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j - k][1] - 1);

2.如果为T

依次枚举在第i个位置变化了几步,范围也是[0,j],假设变换k

  1. 如果k为奇数,这时就变化成了F,所以dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j - k][0] + 1);

    dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j - k][1] - 1)
  2. 如果k为偶数,这时还是T,所以dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j - k][1]);

    dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j - k][0])

其中还有一个问题:

就是和刚开始的方向的无关,不用管朝哪个方向,只要走的最远的就行了,而且始终有两个相互对立的方向。初始化的时候dp[0][0][0]dp[0][0][1]都得初始化0,这样才可以往哪走都可以.

for (int i = 0; i <= len; i++)
        for (int j = 0; j <= n; j++) dp[i][j][0] = dp[i][j][1] = -inf;
    dp[0][0][0] = 0;//正方向
    dp[0][0][1] = 0;//负方向,两边都可以走
    for (int i = 1; i <= len; i++)
    {
        for (int j = 0; j <= n; j++)
        {
            for (int k = 0; k <= j; k++)
            {
                if (cmd[i] == 'F')
                {
                    if (k & 1)
                    {
                        dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j - k][1]);
                        dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j - k][0]);
                    }
                    else
                    {
                        dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j - k][0] + 1);
                        dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j - k][1] - 1);
                    }
                }
                else
                {

                    if (k & 1)
                    {
                        dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j - k][0] + 1);
                        dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j - k][1] - 1);
                    }
                    else
                    {
                        dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j - k][1]);
                        dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j - k][0]);
                    }
                }
            }

        }

    }