标签:
题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=5900
n
个pair<int , int>
,每次可以选相邻两个pair
。如果他们的first
不互质就可以把它们都删掉,并且获得second
之和的分数,问最大得分。#include <iostream> #include <algorithm> #include <stdio.h> #include <queue> #include <cmath> #include <string.h> using namespace std; long long a[305],b[305]; long long dp[305][305]; long long sum[305]; long long GCD(long long a,long long b) { return (b==0)?a:GCD(b,a%b); } int main() { int T,N; cin>>T; while(T--) { scanf("%d",&N); for(int i=1;i<=N;i++) scanf("%lld",&a[i]); sum[0]=0; for(int i=1;i<=N;i++) { scanf("%lld",&b[i]); sum[i]=sum[i-1]+b[i]; } memset(dp,0,sizeof(dp)); for(int len=1;len<N;len++) { for(int i=1;i+len<=N;i++) { if(sum[i+len-1]-sum[i]==dp[i+1][i+len-1]) { dp[i][i+len]=dp[i+1][i+len-1]; if(GCD(a[i],a[i+len])>1) dp[i][i+len]+=b[i]+b[i+len]; } for(int k=i;k<i+len;k++) { dp[i][i+len]=max(dp[i][i+len],dp[i][k]+dp[k+1][i+len]); } } } printf("%lld\n",dp[1][N]); } return 0; }
2016 年沈阳网络赛---QSC and Master(区间DP)
标签:
原文地址:http://www.cnblogs.com/chen9510/p/5882927.html