C题 求题解

1 answer(s)

0

其实足够耐心的话 可以看排名里 别人的AC代码 思路应该就是动态规划吧,状态dp[i]表示 前i个数的合法的方案数,转移是

dp[i] = sum{ dp[k] | 1 < k < i && sum(k+1,i)!=0 } = sum{ dp[k] | 1 < k < i } - sum{ dp[k] | 1 < k < i && sum(k+1,i)==0 }

关键是求后半部分怎么找到sum(k+1,i)==0 的k, 等价于找 prefixSum(k)== prefixSum(i),因为这里前缀比后缀维护容易。利用容器map M, M[ps] = sum{dp[k] | prefixSum(k)==ps }。 那么 dp[i] = sum{ dp[k] | 1 < k < i } - M[prefixSum(i)]。

write answer 切换为英文 切换为中文


转发分享