微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

给定N个红色糖果和M个蓝色糖果找出并排放置不超过K个相同颜色的K糖果的布置的数量?

如何解决给定N个红色糖果和M个蓝色糖果找出并排放置不超过K个相同颜色的K糖果的布置的数量?

我了解的是,我们需要找到N + M的所有排列。 我坚持认为这可以帮助任何人在这里使用哪种数据结构。

首先,我创建一个N + M的字符串,然后调用

static String[] getper(String str) {
        // Todo Auto-generated method stub

        if (str.length() == 0) {
            String arr[] = { "" };
            return arr;
        }
        char c = str.charat(0);
        String restOfString = str.substring(1);
        String[] rr = getper(restOfString);

        int k = 0;
        String result[];

        // create array,not the base case
        if (rr.length == 1 && rr[0] == "") {
            result = new String[1];
        } else {
            result = new String[(rr[0].length() + 1) * rr.length];
        }
        
        for (int i = 0; i < rr.length; i++) {
            System.out.println("for value:" + rr[i] + " inserting:" + c);
            for (int j = 0; j <= rr[i].length(); j++) {
                result[k] = rr[i].substring(0,j) + c + rr[i].substring(j);
                k++;
            }

        }
        return result;
    }```

解决方法

为大的MN生成大量的所有组合是不现实的。

但是我们可以计算出没有K+1个相似糖果的情况下的变体数量。

为红色和蓝色糖果制作大小为(N+M+1)x(N+1)x(K+1)(N+M+1)x(M+1)x(K+1)的桌子。

条目Red[i][r][j]包含长度为i的良好序列,最后以j个红色糖果使用r红色糖果结尾(我们需要限制红色糖果的总数)由N

类似于Blue[i][b][j]

我们可以计算出Red[i][r][j]存在多少个好序列,向Blue[i-1][i-1-b-1]行的任何单元格添加一个红色糖果。另外,我们可以为单元格Red[i-1][r-1][j<K]添加一个红色糖果(所有以K红色结尾的红色糖果)。

逐层填充红色和蓝色表,最后一层(Red[N+M] and Blue[N+M])的总和是变体的数量。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。