HDU 3127 (DP)

来源:互联网 发布:java培训工资 编辑:程序博客网 时间:2024/05/22 14:41

写过的最坑的题目。

题意很不清楚,意思是把一块布横向或者纵向切割,如果得到一块长xi,宽yi的布就可以得到vi的价值。

首先每两次切割都必须得到一块有价值的布(题目哪里有说啊)。

然后就很简单了暴力枚举。

坑爹的是long long 死活wa 改成int居然就好了也是瞎了狗眼。

#include <bits/stdc++.h>using namespace std;#define maxn 33struct node {    int x, y, val;    node (int _x = 0, int _y = 0, int _val = 0) : x(_x), y(_y), val(_val) {}}p[maxn];int t, n, tot;int dp[1111][1111];int solve (int x, int y) { //长x 宽y    memset (dp, 0, sizeof dp);    for (int i = 0; i <= x; i++) {        for (int j = 0; j <= y; j++) {            for (int k = 0; k < tot; k++) {                if (i >= p[k].x && j >= p[k].y) {                    dp[i][j] = max (dp[i][j], dp[i-p[k].x][j]+dp[p[k].x][j-p[k].y]+p[k].val);                    dp[i][j] = max (dp[i][j], dp[i][j-p[k].y]+dp[i-p[k].x][p[k].y]+p[k].val);                }            }        }    }    return dp[x][y];}int main () {    //freopen ("in", "r", stdin);    scanf ("%d", &t);    while (t--) {        tot = 0;        int x, y;        scanf ("%d%d%d", &n, &x, &y);        if (n == 0) {            printf ("0\n");            continue;        }        for (int i = 1; i <= n; i++) {            int xx, yy, vv;            scanf ("%d%d%d", &xx, &yy, &vv);            p[tot++] = node (xx, yy, vv);            p[tot++] = node (yy, xx, vv);        }        printf ("%d\n", solve (x, y));    }    return 0;}


0 0
原创粉丝点击