description
bsny在杭州旅行,想去
n 個景點,於是他找來
n個導遊,每個導遊負責帶bsny去乙個景點玩一天,因此需要
n 個導遊。這個
n個導遊對於
n 個景點有不同的熟悉度和喜愛度。為了旅遊愉快,bsny想盡量讓每個導遊可以去熟悉度和喜愛度最高的景點,但顯然無法滿足所有導遊,因為bsny希望想一種方案,使得每個導遊的熟悉度總和與喜愛度總和之
積最大。你能告訴他最大能達到多少嗎?
input
第一行乙個數n。
接下來乙個n∗
n 的矩陣,其中元素fi
,j代表導遊
i 對景點
j的熟悉度。
接下來乙個n∗
n 的矩陣,其中元素li
,j代表導遊
i 對景點
j的喜愛度。
n<=
17 ,
1<=fi
,j,l
i,j<=1,
000
output
僅一行表示最大的熟悉度總和與喜愛度總和之積。
sample input
3 1 2 3
2 3 1
3 1 2
1 2 3
2 3 1
3 1 2
sample output
81樣例解釋
1導遊選擇3景點,2導遊選擇2景點,3導遊選擇1景點。
於是熟悉度之和為(3+3+3)=9, 喜愛度之和為(3+3+3)=9, 積為9*9=81 這個是最大方案。
hint
思路
這道題的資料範圍很小,一定是搜尋。但是一般的搜尋會tle,那麼要想一些優化措施了,令fi
,s表示選擇了
i 個景點的狀態為
s的最大熟悉度之和,gi
,s表示選擇了
i 個景點的狀態為
s的最大喜愛度之和,如果當前選擇的熟悉度之和為su
mx,喜愛度之和為su
my,最終答案為an
s ,那麼(s
umx+
fi,s
)∗(s
umy+
gi,s
)>=an
s 才可能更新答案,這樣剪枝所得到的時間複雜度很低了。
**
#include
#include
const
int maxn=17;
int n,f[maxn+2][1
<2][1
int dfs(int now,int s,int sumx,int sumy)
if((f[now][s]+sumx)*(g[now][s]+sumy)return
0; }
for(int i=1; i<=n; i++)
}return0;}
int main()
}for(int i=1; i<=n; i++)
}for(int i=n; i>0; i--)}}
}dfs(1,0,0,0);
printf("%d\n",ans);
return
0;}
NOIP模擬賽 最佳組合
bzeroth 大陸最終還是覆滅了,所以你需要為地災軍團服務了。地災軍團軍師黑袍不擅長寫題面,所以你只需要看簡化版的題意即可。給定 3 個長度均為 n 的正整數序列 a b c 要求從三個序列中分別取出 3 個數 a i b j c k 使得 c k b j c k a i b j a i 最小。第...
NOIP2012模擬10 25 旅行
給定乙個n行m列的字元矩陣,代表空地,x 代表障礙。移動的規則是 每秒鐘以上下左右四個方向之一移動一格,不能進入障礙。計算 在空地中隨機選擇起點和終點 可以重合,此時最短耗時為0 從起點移動到終點最短耗時的平均值。每一行每一列至多有1個障礙,並且障礙不在對角線方向相鄰。以下矩陣是不合法的 x x.第...
NOIP2012模擬10 25 旅行
給定乙個n行m列的字元矩陣,代表空地,x 代表障礙。移動的規則是 每秒鐘以上下左右四個方向之一移動一格,不能進入障礙。計算 在空地中隨機選擇起點和終點 可以重合,此時最短耗時為0 從起點移動到終點最短耗時的平均值。每一行每一列至多有1個障礙,並且障礙不在對角線方向相鄰。以下矩陣是不合法的 xx.50...