P8848 1 and -1 题解
我们分类讨论。
设
Part 1: p\le q
容易发现最小的最大子段和为
这样,就是在
Part 2: p>q
在这种情况下,最大子段和为
初始化
答案为
code:
注意空间复杂度,可以选择用 vector,也可以用滚动数组(这个更好)。
#include<bits/stdc++.h>
using namespace std;
const int N=10086;
const int mod=998244353;
typedef long long ll;
int n,cp=0,cq=0;
vector<int> a[N];
signed main(){
int x;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&x),x==1?cp++:cq++;
int m=cp-cq;
//a[0].push_back(1);
if(m>0){
for(int i=0;i<=cq;i++)
for(int j=0;j<=m;j++){
int s=0;
if(i&&j!=m)s+=a[i-1][j+1];
if(j)s+=a[i][j-1];
a[i].push_back(i||j?s%mod:1);
//printf("%d ",i||j?s%mod:1);
}
printf("%d",a[cq][m]);
}
else{
for(int i=0;i<=1-m;i++)
for(int j=0;j<=cp;j++){
int s=0;
if(i)s+=a[i-1][j];
if(j)s+=a[i][j-1];
a[i].push_back(i||j?s%mod:1);
}
printf("%d",a[1-m][cp]);
}
return 0;
}