一个n数组求和问题

这是我再水木社区看到的题目,然后自己思考了下。

问题是这样的,现在有n个长度都为m的int数组, 每个数组可以有两种行为:原地不动,或者数组翻转。所谓数组翻转,就是a[i]=a[m-1-i],首尾颠倒。比如: [1,3,2,9]的翻转就是[9,2,3,1]。现我们将这n个翻转或者不翻转的数组的对应位置相加成一个新数组(sum[i]=a1[i]+a2[i]+...+an[i]),
现找到最优解让sum数组的方差最小。

1).用一个二维数组array[n][m]表示n个长度为m大小的数组,初始化数据。
2).计算sum的平均值S_average = sum(array)/m,这求得sum[i]的平均值。
3).定义一维数组exchange[n]用于标记第i是否翻转,再定义一个result[n]表示最后翻转的结果。
4).定义count记录翻转的个数。
5).定义两个数组OldValue[m],newValue[m]存储sum[i]的值,即每一列的值
6).大概思路
  
  
计算只翻转第一行,即array[1][m];
得到OldValue=计算得到翻转count个后的值;
  
for(count=1;count<=n;++count)
{
    select(exchange);(排列组合,选择exchange中的count个行进行翻转)
    
    newValue=计算得到翻转count个后的值
  
    if(方差(newValue)<方差(OldValue))
    {
        OldValue =  newValue;
        
        get(result);  
  
     }
  
  }
  
  
  
最后你需要的值在OldValue中,翻转了哪些行记录在result中,不知道这行不行啊

posted @ 2013-09-13 14:56  梧桐树下的一缕阳光  阅读(400)  评论(0编辑  收藏  举报