原题链接
任意三点不交于一点,求n(<=700)条线段形成的可能的交点数。
分析:
与该题的不同之处在于是输出所有可能的交点数,直接打表会超时,而dp的时间复杂度是n^4,也会超时。
由打表可知,不存在的交点数最多到31500,故打表与dp只需考虑到31500即可,之后的一定满足,直接输出即可。
再结合bitset进行优化:
将for(int j=0;j<=m;j++) for(int k=1;k<=n-i;k++) dp[i+k][j+k*i]|=dp[i][j];
转换成for(int k=1;k<=i;k++) dp[i]|=dp[k]<<(k*(i-k));
时间复杂度是31500*n^2/32。
const int up=35000;
int n;
bitset<up> dp[maxv];
void init(){
for(int i=1;i<maxv;i