如何解决Cherry Pickup问题的DP解决方案

时间:2019-02-25 05:45:42

标签: java

我的方法似乎是正确的,问题是是否允许多次旅行。 我的解决方案似乎超出了正确答案。

问题:

在代表樱桃字段的N x N网格中,每个单元格是三个可能的整数之一。

0表示单元格为空,因此您可以通过; 1表示该单元格包含一个樱桃,您可以拾取它并通过它; -1表示该单元格包含刺伤您的道路。

您的任务是按照以下规则收集最大数量的樱桃:

从位置(0,0)开始并通过在有效路径单元格(值为0或1的单元格)中向右或向下移动而到达(N-1,N-1); 到达(N-1,N-1)后,通过在有效路径单元格中向左或向上移动返回到(0,0); 当通过包含樱桃的路径单元格时,将其拾取并变为空单元格(0); 如果(0,0)与(N-1,N-1)之间没有有效路径,则无法收集樱桃。

我的解决方案:

class Solution {
    public int cherryPickup(int[][] grid) {

     int N = grid.length;

        int[][] dp;
        char[][] track;

        boolean f = true;

        int sum = 0;
        int count = 0;

        while(f)
        {
            dp = new int[N][N];
            track = new char[N][N];

            dp[0][0] = grid[0][0];
            track[0][0] = 'a';

            char c;

            c='u';

            for(int i=1;i<N;i++)
            {
              if(c=='r'||grid[i][0]==-1)
              {
                  c='r';
                  dp[i][0]=-1;
              }
                else
                    dp[i][0] = dp[i-1][0] + grid[i][0];

                track[i][0] = c;
            }

            c='s';

            for(int j=1;j<N;j++)
            {
                if(c=='r'||grid[0][j]==-1)
                {
                    c='r';
                    dp[0][j]=-1;
                }
                else
                    dp[0][j] = dp[0][j-1] + grid[0][j];

                track[0][j] = c;
            }

            for(int i=1;i<N;i++)
                for(int j=1;j<N;j++)
                {
                    if(grid[i][j]==-1||(track[i-1][j]=='r' && track[i][j-1]=='r'))
                    {
                        track[i][j] = 'r';
                        dp[i][j] = -1;
                    }
                    else
                    {
                        if(dp[i-1][j]>=dp[i][j-1])
                        {
                            track[i][j] = 'u';
                            dp[i][j] = dp[i-1][j] + grid[i][j];
                        }
                        else
                        {
                            track[i][j] = 's';
                            dp[i][j] = dp[i][j-1] + grid[i][j];
                        }
                    }
                }


            if(dp[N-1][N-1]<=0)
                break;

            sum += dp[N-1][N-1];

            int r = N-1 , cr = N-1;

            while(r>0||cr>0)
            {
                grid[r][cr]=0;
                if(track[r][cr]=='s')
                    cr--;
                else
                    r--;
            }

            grid[0][0] = 0;

        }

      return sum;
    }
}

有人可以帮忙吗?

0 个答案:

没有答案