看题目,数据量不大,那我们直接开一个二维矩阵来做区间dp,用树状数组记录我们区间中1的个数,而0的个数可以通过计算出来,值得注意的是我们的划分k这里定义的是在第k个元素后面划分
#include<bits/stdc++.h>
using namespace std;
int n,l,r;
int a[505];
int b[505]; // 用来记录1的个数
int dp[505][505];
int lowbit(int x){return x&(-x);
}
void add(int x,int p){
for(int i=x;i<=n;i+=lowbit(i)){
b[i] += p;
}
}
int query(int x){
int ans = 0;
for(int i=x;i;i-=lowbit(i)) ans+=b[i];
return ans;
}
int main(){
cin >> n >> l >> r;
string s;
cin >> s;
for(int i=0;i<n;i++){
a[i+1] = s[i]-'0';
if(a[i+1]) add(i+1,1); // 记录1的个数
}
for(int len=2;len<=n;len++){
for(int i=1;i<=n-len+1;i++){
int j = i+len-1;
for(int k=i;k<j;k++){ // 定义每次切割为在第k个的后面
int zuo = query(k)-query(i-1),you = query(j)-query(k);
zuo = (k-i+1-zuo);
if(abs(zuo-you)<l||abs(zuo-you)>r) continue;
dp[i][j] = max(dp[i][j],dp[i][k]+dp[k+1][j]+1);
}
}
}
cout << dp[1][n];
return 0;
}