题意:有n个数,第一行是a[i]的大小,第二行是b[i]的价值,如果a[i]中相邻两个数的gcd>1那么就可以加上这两个人数相应的价值。
思路:数位dp。
注意点: LL。维护前缀和。
#include<bits/stdc++.h>
#define debug(a) cout << #a << " " << a << endl
#define LL long long
#define PI acos(-1.0)
#define eps 1e-6
const int N=300+7;
using namespace std;
LL a[N],b[N];
LL dp[N][N];
LL sum[N];
int main ()
{
//yyy_3y
//freopen("1.in","r",stdin);
int t; scanf("%d",&t);
while(t--){
memset(dp,0,sizeof(dp));
int n; scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<=n;i++) scanf("%lld",&b[i]),sum[i]=sum[i-1]+b[i];
for(int l=2;l<=n;l++){
for(int i=1;i<=n-l+1;i++){
int j=l+i-1;
for(int k=i;k<j;k++) dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]);
if(__gcd(a[i],a[j])>1){
if(j==i+1) dp[i][j]=b[i]+b[j];
else if(dp[i+1][j-1]==sum[j-1]-sum[i])dp[i][j]=max(dp[i][j],dp[i+1][j-1]+b[i]+b[j]);
}
}
}
printf("%lld\n",dp[1][n]);
}
}