您的位置:首页 > 其它

HDU 5900 QSC and Master(2016 ACM/ICPC Asia Regional Shenyang Online)

2016-09-26 10:24 501 查看

吐槽

2016沈阳网络赛最水的题目,自己写了2个小时无果,最终放弃,作为搞dp的我深感自责,自己区间dp确实也没有做过几道题,当时只是模模糊糊写出了状态转移方程,假如I和k匹配,那么一定要保证i+1到k+1中的所有数也需要匹配,就这一点一直没有好的想法,加上自己网络赛的气氛比较沉重,最后无果!!!,因此这道题很显然就是需要特殊判断一下,别的没有什么大问题。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 305;
typedef long long LL;

LL key[maxn],val[maxn], sum[maxn], dp[maxn][maxn];

LL gcd(LL a,LL b){
return !b?a:gcd(b, a%b);
}

int main(){
int T, N;
scanf("%d", &T);
while(T--){
scanf("%d", &N);
for(int i = 1; i <= N; i++) scanf("%I64d", &key[i]);
for(int i = 1; i <= N; i++) scanf("%I64d", &val[i]);
memset(sum, 0, sizeof(sum));
for(int i = 1; i <= N; i++) sum[i] = sum[i-1]+val[i];  //预处理val值的前缀和
memset(dp, 0, sizeof(dp));
for(int len = 1; len <= N; len++){  //区间长度
for(int i = 1; i+len <= N; i++){ //枚举区间右端点
int j = i+len;
if(gcd(key[i], key[j]) != 1){  //如果不互质,那么需要特判
if(j-i == 1) dp[i][j] = val[i]+val[j]; //这里很显然
else if(sum[j-1] - sum[i] == dp[i+1][j-1]) //很显然把这一段区间的所有值都包括一定最优
dp[i][j] = max(dp[i][j], dp[i+1][j-1]+val[i]+val[j]);
}
for(int k = i; k <= j; k++)  //简单的转态转移。这里就不多说了
dp[i][j] = max(dp[i][j], dp[i][k]+dp[k+1][j]);
}
}
printf("%I64d\n", dp[1]
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐