悬两关,帮我优化下动态规划代码
  • 板块学术版
  • 楼主naroto2022
  • 当前回复5
  • 已保存回复6
  • 发布时间2024/5/19 17:08
  • 上次更新2024/5/19 19:53:40
查看原帖
悬两关,帮我优化下动态规划代码
734703
naroto2022楼主2024/5/19 17:08
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int mod=998244353;
const int MN=2005;
long long n,ans,num,a[MN],dp[MN][MN],s[MN];
//前i个数分成j段最多的办法
int main(){
	scanf("%lld",&n);
	for(int i=1; i<=n; i++){
		scanf("%lld",&a[i]);
		s[i]=s[i-1]+a[i];
	}
	dp[1][1]=1;
	for(int r=2; r<=n; r++)
		for(int l=1; l<=r; l++){
			num=s[r]-s[l-1];
			for(int j=1; j<=l; j++) if(num%j==0) dp[r][j]=max(dp[r][j],(dp[l-1][j-1]+dp[l-1][j])%mod);
		}
	for(int i=1; i<=n; i++) ans=(ans+dp[n][i])%mod;
	printf("%lld",ans);
	return 0;
}

帮我把时间复杂度降到 O(n2)O(n^2)。

这段代码大概就是说给定一个长度为 nn 的数组 aa,求把 aa 分成若干段使得第 ii 段的内的数字总和为 ii 的倍数的方案数

2024/5/19 17:08
加载中...