炸了啊,刚写完又没了!!
$$
一共个区间,每个区间任取一个数,设,求S的种类。
思路:分组背包问题,&dp[i][j]&表示前i个区间里选i个数是否能表示j,我们要求最后能表示的数的种类数,其实就是。
思路:
1.既然只有两种关系,我们这里就可以用bitset容器来保存每一个状态,通过向左移来求和更新状态,通过异或来添加状态。
2.那么转移状态:。
3.然后还有一些内置函数:比如reset(4),reset函数传一个参数时将参数下标处置为0。
Code:
#include<bits/stdc++.h> #define js ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) using namespace std; const int maxn=1e6+10; bitset<maxn> dp[102]; int n,l,r; int main() { js; cin>>n; dp[0].set(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()<<endl; }