波动数列

题目:

观察这个数列:

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\)存在整数解\(t\)\(c\)满足要求。

经过等效转换,即有数组 \([1a, 2a, 3a,...,(n-1)a]\)
选取任意个,其和值为c个a的组合方案有多少?

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)\)条件下的方案数。

代码:


posted @ 2020-10-09 19:10  Treasure_lee  阅读(227)  评论(0)    收藏  举报