简单瞎搞题

简单瞎搞题

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;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
11-29 12:19
点赞 评论 收藏
分享
11-27 17:35
已编辑
蚌埠坦克学院 C++
深信服 后台开发 n×12
点赞 评论 收藏
分享
11-27 12:36
已编辑
门头沟学院 前端工程师
Apries:这个阶段来说,很厉害很厉害了,不过写的简历确实不是很行,优势删掉吧,其他的还行
点赞 评论 收藏
分享
威猛的小饼干正在背八股:挂到根本不想整理
点赞 评论 收藏
分享
评论
点赞
1
分享
牛客网
牛客企业服务