MnZn简短代码50pts求调
查看原帖
MnZn简短代码50pts求调
374756
忘怜城羡楼主2023/11/23 20:48
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=1001;
int a[MAXN],b[MAXN],s[MAXN],ans[MAXN];
bool vis[MAXN][MAXN],dp[MAXN][MAXN];
signed main()
{
	int n;
	scanf("%lld",&n);
	for(int i(1);i<=n;++i)
		scanf("%lld",&a[i]);
	for(int i(1);i<=n;++i)
	{
		scanf("%lld",&b[i]);
		s[i]=s[i-1]+b[i];
		dp[i][i+1]=(__gcd(a[i],a[i+1])>1?1:0);
	}
	for(int i(1);i<=n;++i)
	{
		for(int j(1);j<=n;++j)
			vis[i][j]=(__gcd(a[i],a[j])>1?1:0);
	}
	for(int k(1);k<=n;++k)
	{
		for(int i(k);i>0;--i)
		{
			for(int j(k+1);j<=n;++j)
			{
				if(vis[i][j])
				{
					dp[i][j]|=dp[i+1][j-1];
					if(j>k+1)
						dp[i][j]|=(dp[i][k]&dp[k+1][j]&dp[k][k+1]);
				}
			}
		}
	}
	for(int i(1);i<=n;++i)
	{
		ans[i]=ans[i-1];
		for(int j(1);j<=i;++j)
			if(dp[j][i])
				ans[i]=max(ans[i],ans[j-1]-s[j-1]+s[i]);
	}
	printf("%lld",ans[n]);
}
2023/11/23 20:48
加载中...