简单瞎搞题

简单瞎搞题

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

相关推荐

就在我现在公司的隔壁每天经过都唏嘘不已(就是羡慕)什么时候可以到这里上班啊
柯基在debug:从大学毕业投简历到现在了,应届的时候我都面到终面了,现在工作四年了连简历初筛都过不了了
投递莉莉丝游戏等公司8个岗位
点赞 评论 收藏
分享
每晚夜里独自颤抖:把华北改为华南再试一试,应该就没啥问题了。改完可能都不用投,别人主动联系了。
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

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