官方题解思路,求条
查看原帖
官方题解思路,求条
1066579
XP3301_Pipi楼主2024/7/6 10:16

根据官方题解乱糊的代码,前三个样例都过了,最后一个过不掉。。。
对思路或代码有帮助都会关注

#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;
}
2024/7/6 10:16
加载中...