HDU5900-QSC and Master(区间dp)

来源:互联网 发布:360游戏优化器独立版 编辑:程序博客网 时间:2024/05/22 03:59

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=5900

思路

区间dp,这道题有个坑点就是比如3 4 8 9,比如4,8选掉了,3和9就变成了相邻的
状态表示:d[i][j] = 区间[i, j]能获得的最大值
转移
1. d[i][j] = max(d[i][j], d[i][k] + d[k + 1][j])
2. 若a[i]和a[j]不互质,并且中间的数全部已经选掉了:d[i][j] = max(d[i][j], (LL)(d[i + 1][j - 1] + a[i].second + a[j].second))

代码

#include <iostream>#include <cstring>#include <stack>#include <vector>#include <set>#include <map>#include <cmath>#include <queue>#include <sstream>#include <iomanip>#include <fstream>#include <cstdio>#include <cstdlib>#include <climits>#include <deque>#include <bitset>#include <algorithm>using namespace std;#define PI acos(-1.0)#define LL long long#define PII pair<int, int>#define PLL pair<LL, LL>#define mp make_pair#define IN freopen("in.txt", "r", stdin)#define OUT freopen("out.txt", "wb", stdout)#define scan(x) scanf("%d", &x)#define scan2(x, y) scanf("%d%d", &x, &y)#define scan3(x, y, z) scanf("%d%d%d", &x, &y, &z)#define sqr(x) (x) * (x)const int maxn = 305;LL d[maxn][maxn], sum[maxn];PII a[maxn];int n;LL solve() {    memset(d, 0, sizeof(d));    a[0].first = 1; a[0].second = 0;    for (int l = 2; l <= n; l++) {        for (int i = 1; i <= n; i++) {            int j = i + l - 1;            if (j > n) continue;            for (int k = i; k < j; k++) {                d[i][j] = max(d[i][j], d[i][k] + d[k + 1][j]);            }            if (__gcd(a[i].first, a[j].first) > 1) {                if (j == i + 1) d[i][j] = max(d[i][j], (LL)(a[i].second + a[j].second));                else if (d[i + 1][j - 1] == sum[j - 1] - sum[i]) d[i][j] = max(d[i][j], (LL)(d[i + 1][j - 1] + a[i].second + a[j].second));            }        }    }    return d[1][n];}int main() {    int T;    scan(T);    while (T--) {        scan(n);        sum[0] = 0;        for (int i = 1; i <= n; i++) scan(a[i].first);        for (int i = 1; i <= n; i++) {            scan(a[i].second);            sum[i] = sum[i - 1] + a[i].second;        }        printf("%lld\n", solve());    }    return 0;}
0 0