這道題是典型的深搜題,應用全排列遍歷的方法可以在無特判的條件下完成。其中的幾個知識點是需要複習的。
楊輝三角
楊輝三角定義在此不表,其為乙個形似下表的數表:
1 1 1
1 2 1
1 3 3 1
1 4 6 4 1
(以下略)
a b c d e
a+b b+c c+d d+e
a+2b+c b+2c+d c+2d+e
a+3b+3c+d b+3c+3d+e
a+3b+6c+3d+e
(以下略)
可以看出,每一層的每乙個數,其值都相當於從自己開始,係數為楊輝三角對應層數的數的多項和式,那麼要計算出最後結果,就用對應層數的楊輝三角輔助求和就可以了。就是二項式定理
stl:next_permutation
不想寫麻煩的全排列怎麼辦?stl中有乙個神奇的函式可以幫你做到這一點:next_permutation
這個函式會按照數字大小從小到大依次生成下乙個排列,效果與dfs是一致的。因此,我們可以利用這個特性來根塊更便捷地做這道題。
說明next_permutation的幾點特性:
(1)其返回值是bool型別,這進一步方便了我們在本題中使用這個函式,若不存在下乙個全排列這說明尋找失敗;
(2)其呼叫方式和其他stl函式基本相同,即輸入需要生成下乙個排列的起止點,左閉右開。
優化思路
在經過楊輝三角的優化後,我們能在o(n
)o(n)
o(n)
的時間內將每次詢問的答案計算出來,但仍不夠。這時,我們需要對全排列的列舉進行優化。思考:若在計算答案過程中,答案的值已經超過了需要的值,那麼之後的所有值都已經沒有意義,因此不必計算。同時,在加入某值時若超出所需範圍,則由我們的列舉順序的性質(從小到大)就可知,在其之後的數也一定會超過範圍。因此我們可以對出現問題的一位到末尾的這一段按從大到小的順序排序,再執行next_permutation,就可以將出項問題一段整體跳過。
ac**
#include
#include
using namespace std;
int n,s,v[15]
,ans,pre[15]
,tri[13]
[15];
void
********()
//處理楊輝三角
for(
int i=
3;i<=
12;i++
)for
(int j=
2;j) tri[i]
[j]=tri[i-1]
[j-1
]+tri[i-1]
[j];
}bool cmp
(int x,
int y)
bool solve
(int a,
int b)}if
(ans==b)
return1;
}while
(next_permutation
(pre+
1,pre+
1+n));
return0;
}int
main()
stl**好!!! 洛谷P1118 數字三角形遊戲
洛谷1118 數字三角形遊戲 題目描述 有這麼乙個遊戲 寫出乙個1 n的排列a i 然後每次將相鄰兩個數相加,構成新的序列,再對新序列進行這樣的操作,顯然每次構成的序列都比上一次的序列長度少1,直到只剩下乙個數字位置。下面是乙個例子 3 1 2 4 4 3 6 7 9 16最後得到16這樣乙個數字。...
SSL ZYC 洛谷 P1118 數字三角形
題目大意 有這麼乙個遊戲 寫出乙個1 n的排列a i 然後每次將相鄰兩個數相加,構成新的序列,再對新序列進行這樣的操作,顯然每次構成的序列都比上一次的序列長度少1,直到只剩下乙個數字位置。下面是乙個例子 3 1 2 4 4 3 6 7 9 16 最後得到16這樣乙個數字。現在想要倒著玩這樣乙個遊戲,...
洛谷1216 數字三角形
題目描述 觀察下面的數字金字塔。寫乙個程式來查詢從最高點到底部任意處結束的路徑,使路徑經過數字的和最大。每一步可以走到左下方的點也可以到達右下方的點。7 3 8 8 1 02 7 4 4 4 5 2 6 5 在上面的樣例中,從7 到 3 到 8 到 7 到 5 的路徑產生了最大 輸入輸出格式 輸入格...