波动数列
题目:
观察这个数列:
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)\)条件下的方案数。
代码:

浙公网安备 33010602011771号