原題鏈結
考察:dfs+剪枝
思路:從最後一列開始dfs,用bool 陣列記錄哪些數字被使用了即可.接下來思考如何剪枝:
搜尋順序剪枝: 從大到小列舉,大數字在低位可能性較大.
冗餘處理:這裡是排列型列舉.
可行性剪枝:比較關鍵,需要兩個剪枝:高位無進製. 從第1列~第n列檢查是否符合實際.
最優性剪枝:無
1 #include 2 #include 3 #include 4using
namespace
std;
5const
int n = 30;6
intn,a[n],b[n];
7char s[4
][n];
8bool
st[n];
9int getid(int i,int
j)10
13bool
check()
1421
for(int i=2;i<=n;i++)
2229
return0;
30}31bool dfs(int k,int
p)32
52 }else63}
64for(int i=n-1;i>=0;i--)
6573
return0;
74}75int
main()
76
P1091 NOIP2004 提高組 合唱隊形
n 位同學站成一排,老師要請其中的 n k 位同學出列,使得剩下的 k 位同學排成合唱隊形。合唱隊形是指這樣的一種隊形 設 k 位同學從左到右依次編號為 1,2,k 他們的身高分別為 t 1,t 2,t k 則他們的身高滿足 t 1 cdots t t k 1 le i le k 你的任務是,已知所...
NOIP提高組2004 合併果子
在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過 n 1n 1n 1 次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合...
題解 NOIP提高組2004 合併果子
在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過n 1次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗體力之和。...