根据官方题解乱糊的代码,前三个样例都过了,最后一个过不掉。。。
对思路或代码有帮助都会关注
#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
using namespace std;
const int N=115,M=2015;
const int IINF=0x3f3f3f3f;
const long long LINF=0x3f3f3f3f3f3f3f3fll;
inline void FileIO(){
freopen(".in","r",stdin);
freopen(".out","w",stdout);
}
template<typename Type>
inline void read(Type& res){
Type f=1,x=0; char c=' '; while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
res=x*f;
}
int n,a[N],L,R;
const ll mod=998244353,D=1002;
ll dp[N][M],ans;
void Debug(){
for(int i=1;i<=n;i++){
for(int j=L;j<=R;j++) printf("Dp[%d][%d]=%lld\n",i,j,dp[i][j+D]);
}
}
signed main(){
// 不开longlong见祖宗!全开longlong见祖宗!
// 检查数组大小!
// 注意输出格式!
read(n);
for(int i=1;i<=n;i++){
read(a[i]);
if(a[i]<0) L+=a[i];
else R+=a[i];
}
dp[0][D]=1;
for(int i=0;i<n;i++){
for(int j=L;j<=R;j++){
if(!j) continue;
for(int k=i+1;k<=n;k++){
dp[k][a[k]+j+D]+=dp[i][j+D];
dp[k][a[k]+j+D]%=mod;
}
}
set<int> s;
for(int k=i+1;k<=n;k++){
for(const int &p:s){
dp[k][a[k]+p+D]+=dp[i][D];
dp[k][a[k]+p+D]%=mod;
}
if(a[k]) s.insert(a[k]);
}
}
for(int i=0;i<=n;i++) for(int j=L;j<=R;j++) ans=(ans+dp[i][j+D])%mod;
// Debug();
printf("%lld\n",ans);
return 0;
}