思路
考虑
f
[
i
]
f[i]
f[i] 表示以
i
i
i 结尾最多可以分的区间个数
显然 当
a
[
i
]
−
a
[
j
]
>
=
b
[
i
]
−
b
[
j
]
&
&
f
[
j
]
!
=
−
1
a[i] - a[j] >= b[i] - b[j] \&\& f[j] != -1
a[i]−a[j]>=b[i]−b[j]&&f[j]!=−1时
f
[
i
]
=
m
a
x
(
f
[
j
]
+
1
,
f
[
i
]
)
,
j
∈
[
0
,
i
−
1
]
f[i] = max(f[j]+1,f[i]) ,j \in [0,i-1]
f[i]=max(f[j]+1,f[i]),j∈[0,i−1]
代码
int f[5005]; // 以n结尾最大可以分的区间个数
void solve(){
int n;cin>>n;
vector<int> a(n+1),b(n+1);
forr(i,1,n) cin>>a[i],a[i] += a[i-1];
forr(i,1,n) cin>>b[i],b[i] += b[i-1];
mem(f,-1);
f[0] = 0;
forr(i,1,n){
forr(j,0,i-1){
if(a[i] - a[j] >= b[i] - b[j] && f[j] != -1) f[i] = max(f[i],f[j]+1);
}
}
cout << f[n] << endl;
}
signed main()
{
int t;cin>>t;
while(t--) solve();
return 0;
}