我有一个n*3二维数组,需要找到元素的最小和,这样:
不能漏掉任何行,即每行应有一个元素。
一行只能选择一个元素。
不能在相邻行中选择行中选定的元素。
如。
10 50 45个
30 10 15年
70 05 25个
092797年
如果从索引0处的行中选择10,则无法从索引1处的行中选择30。
同样,如果从索引1的行中选择10,则不能从索引2的行中选择05。
阵列的最优解为:10+15+05+9=39
注:也许匈牙利算法的迭代可以解决这个问题。
但我不知道该怎么做。

最佳答案

动态编程。
DP[i][j]为第一行i中的最小和,最后获取的元素来自列j
假设数组是1索引的

DP[0][j] = 0

DP[i][j] = min(DP[i-1][x])+A[i][j]  (j!=x , 1<=x<=3)

答案是min(DP[N][j]);最小值超过1<=j<=3
编辑:
    for (int i=1;i<=n;i++)
    {
        for (int j=1;j<=3;j++)
        {
            int mn=INF;
            for (int x=1;x<=3;x++)
                if (j!=x) // 3rd rule
                    mn = min(mn,DP[i-1][x]);
            DP[i][j] = mn+A[i][j];
        }
    }
    cout<<min(DP[n][1],min(DP[n][2],DP[n][3]))<<endl;

07-24 19:21
查看更多