题意:对于一个序列。能够进行这种操作:选择两个同样的数,将它们替换为它们的和。假设一个序列能够得到2048,那么就说这个序列式good的。给出一个序列,问这个序列有多少个子序列是good 的。
思路:開始卡超时卡傻了。这题时限真是太紧。还得加读写优化。
。。
事实上思路还不算难想。因为选一个子序列。因此给出的数的顺序是无用的,另外。能够发现。仅仅用形如2^i这种数才是实用的,其它数对于构成2048是没有影响的。
因此,统计一下2^i这种数有多少个,还有其它的数有多少个,那么先用前面的东西求出来的结果再乘上2^x即可了。x是其它的数的个数。用dp[i][j]表示使用前i种数,最多能得到j个2^i的序列有多少个,那么首先能够发现不使用2^i的话,dp[i][j] = dp[i-1][j/2]。
然后枚举一下使用了多少个2^i,这里不能枚举太多,让j*2^i <= 2048即可了,剩下的通过组合数算一算。
代码:
#include #include #include #include #include #include