1. 程式人生 > 實用技巧 >RNN編碼器-解碼器

RNN編碼器-解碼器

題目:

觀察這個數列:

1 3 0 2 -1 1 -2 ...

這個數列中後一項總是比前一項增加2或者減少3。
棟棟對這種數列很好奇,他想知道長度為 \(n\) 和為 \(s\) 而且後一項總是比前一項增加\(a\)或者減少\(b\)的整數數列可能有多少種呢?

分析:

轉換為01揹包問題求解。

設首項為\(t\),將加\(a\)減$b 記作 \(F(i)=(a,-b)\)

1      t
2      t+F(1)
3      t+F(1)+F(2)
4      t+F(1)+F(2)+F(3)
...
n      t+F(1)+F(2)+F(3)+...+F(n-1)
//前n項和
SUM(n)  s=n*t+(n-1)F(1)+(n-2)F(2)+....+F(n-1)

所以:\(n*t =s-((n-1)F(1) + (n-2)F(2) +...+F(n-1))\)

由於\(F(i)\)不是\(a\)就是\(b\),因此我們假設\(a\)的個數為c

\(F(i)\)的個數為\(n-1,n-2,...2,1\)也就是\(n*(n-1)/2\)個。即b的個數為\(n*(n-1)/2-c\)個。

所以:令\(temp=s-c*a+((n-1)*n/2-c)*b\)

\(temp%n==0\)時,說明\(temp==n*t\),滿足要求。

\(c\)為的大小取決於\(1,2,...n-1\)若干個數組合的方案數。

ij	0	1	2	3	4	5	6	7	8	9
0	1	0	0	0	0	0	0	0	0	0
1	1	1	0	0	0	0	0	0	0	0
2	1	1	1	1	0	0	0	0	0	0
3	1	1	1	2	1	1	1	0	0	0

上表是\(n=4,s=10\)的動態規劃結果。每一項都是\((i,j)\)條件下的方案數。

程式碼: