我有一个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;