动态编程,按位xor后的所有3个子阵列的总和

时间:2017-01-17 20:56:54

标签: java c# dynamic-programming

我最近遇到了一个动态编程问题,我需要解决它,所以我无法弄清楚自己,所以我开始寻找解决方案。问题是:

班上有N名学生。每个学生的实力是一个小的非负整数。

你是 给定具有N个元素的int []强度的这些优势。 您将把所有学生分成三个小组参加“TrySail”赛艇比赛。每个学生都必须 分配给三个团队中的一个。团队不能为空。 奇怪的是,在这场比赛中,球队的实力是其成员优势的逐步提升。 你想最大化三支球队的优势总和。计算并返回尽可能大的 团队优势的总和。

约束:

1)N将在3到50之间,包括在内。

2)强度将包含正好N个元素。

3)每个强度元素都在0到255之间,包括0和255.

我找到了一些解决方案并具体说明了这一点。但我仍然不知道这里发生了什么,即使我每行调试一行。因此,如果有人知道这个问题或了解这个问题以及他在何处以及为何使用变量sum和按位 xor 他们( ^ ),那么对于某些评论来说这将是非常好的。

以下是代码:

public class TrySail
{
    public int get(int[] strength)
    {
        var dp = new bool[256, 256];
        dp[0, 0] = true;
        var sum = 0;
        foreach (var x in strength)
        {
            var next = new bool[256, 256];
            for (int i = 0; i < 256; i++)
                for (int j = 0; j < 256; j++)
                {
                    if (!dp[i, j]) continue;
                    var rem = sum ^ i ^ j;
                    next[i ^ x, j] |= dp[i, j];
                    next[i, j ^ x] |= dp[i, j];
                    next[i, j] |= dp[i, j];
                }
            dp = next;
            sum ^= x;
        }
        var max = 0;
        for (int i = 0; i < 256; i++)
            for (int j = 0; j < 256; j++)
            {
                if (!dp[i, j]) continue;
                var rem = sum ^ i ^ j;
                max = Math.Max(max, i + j + rem);
            }
        return max;
    }

}

一个例子:

{7,3,5,2}

Returns: 17

There are 6 ways to make 3 teams:

· {0},{1},{2,3}: sum of strengths is 7+3+(5 xor 2) = 17

· {0},{2},{1,3}: sum of strengths is 7+5+(3 xor 2) = 13

· {0},{3},{1,2}: sum of strengths is 7+2+(3 xor 5) = 15

· {1},{2},{0,3}: sum of strengths is 3+5+(7 xor 2) = 13

· {1},{3},{0,2}: sum of strengths is 3+2+(7 xor 5) = 7

· {2},{3},{0,1}: sum of strengths is 5+2+(7 xor 3) = 11

Therefore, the answer is 17.

代码用C#编写

0 个答案:

没有答案