這是我再水木社區看到的題目,而後本身思考了下。數組
問題是這樣的,如今有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數組的方差最小。get
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中,不知道這行不行啊社區