http://acm.hdu.edu.cn/showproblem.php?pid=5900
区间dp 关键是怎么判断i与j能否变为相邻元素 即判断[i+1,j-1]内的元素能否两两配对消去
其实如果[i+1,j-1]全部可以消去 那dp数组中表示该区间的元素一定等于该区间数值之和 一开始居然智障的判了一下[i,j]所有元素的gcd是否为1。。
using namespace std;
typedef long long ll;
const int maxn=3e2+10;
ll dp[maxn][maxn];
ll key[maxn],val[maxn],sum[maxn];
int n;
int main()
{
int t,i,j,k;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%lld",&key[i]);
}
for(i=1;i<=n;i++){
scanf("%lld",&val[i]);
sum[i]=sum[i-1]+val[i];
}
memset(dp,0,sizeof(dp));
for(i=2;i<=n;i++){
for(j=1;j+i-1<=n;j++){
for(k=j;k+1<=j+i-1;k++){
dp[j][j+i-1]=max(dp[j][j+i-1],dp[j][k]+dp[k+1][j+i-1]);
}
if(__gcd(key[j],key[j+i-1])!=1&&dp[j+1][j+i-2]==sum[j+i-2]-sum[j]){
dp[j][j+i-1]=max(dp[j][j+i-1],dp[j+1][j+i-2]+val[j]+val[j+i-1]);
}
}
}
printf("%lld\n",dp[1][n]);
}
return 0;
}