简单瞎搞题

简单瞎搞题

http://www.nowcoder.com/questionTerminal/89e3ced7ad9b4874959f2b3679ae0bbf

显然可以dp。

dp[i][j] 为前i个数字能否构成j。

怎么状态转移呢?每次第i个数有一个对应区间,我们直接尝试加入区间的每一个数字,和前i-1个数能构成的数字去匹配。

我们就可以发现这样复杂度是:1e6 * 100 * 100为1e10,不过我们只需要知道能否构成,所以可以状态压缩,然后用bitset即可。

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int N=110;
bitset<1000010> dp[N]; int n,l,r;
signed main(){
    cin>>n; dp[0][0]=1;
    for(int i=1;i<=n;i++){
        cin>>l>>r;    for(int j=l;j<=r;j++) dp[i]|=(dp[i-1]<<(j*j));
    }
    cout<<dp[n].count();
    return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
06-24 20:25
腾讯今年实习招了这么多人,后面秋招还会招人吗??想着秋招再战来着
牛客965593684号:腾讯好像2020年之后就是实习生招得多,应届生基本上不招,纯实习转正
点赞 评论 收藏
分享
06-19 19:06
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务