之前在长沙写的,发现自己又忘了,于是拿出来。。
感觉dp还比较有用,五边形数什么的也就是bike这种毒瘤出题人会考吧。。。
整数划分问题
把整数n拆成若干整数的和,问方案数。
1.完全背包:O(n^2)
2. f ( i , j ) f(i,j) f(i,j)表示j拆成i个数的方案数,有
f ( i , j ) = f ( i , j − i ) + f ( i − 1 , j − 1 ) f(i,j)=f(i,j-i)+f(i-1,j-1) f(i,j)=f(i,j−i)+f(i−1,j−1) (放入一个1或所有数大小+1)
时间复杂度O(n^2)
拓展:
1)拆成两两不同的整数时,不能连续放入两个1而不进行所有数+1操作,即放入1前一次操作只能是+1,
f ( i , j ) = f ( i , j − i ) + f ( i − 1 , j − 1 − ( i − 1 ) ) = f ( i , j − i ) + f ( i − 1 , j − i ) f(i,j)=f(i,j-i)+f(i-1,j-1-(i-1))=f(i,j-i)+f(i-1,j-i) f(i,j)=f(i,j−i)+f(i−1,j−1−(i−1))=f(i,j−i)+f(i−1,j−i)
因为数两两不同,最多只有 n \sqrt n n个数( ( 1 + n ) ∗ n > n (1+\sqrt n)*\sqrt n>n (1+n)∗n>n),复杂度为O(n*sqrt(n))。
再拓展:如果只能用 ≤ x \leq x ≤x的数怎么做?每次 f ( i , v ) − = f ( i − 1 , v − ( x + 1 ) ) f(i,v)-=f(i-1,v-(x+1))