HDU 3127 WHUgirls(矩阵切割)



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

题意:

给出布条有n种剪法还有布条的长宽分别为X,Y,然后给出每种剪法的小布条的长宽与价值,要求最后剪除布条的总最大价值。

思路:

这道题布条的总大小即为容量,而且每种剪法的小布条都有价格,很明显的背包题,而且由于每种减法可以多次使用,构成一个完全背包,由于布条有长宽,所以使用二维数组。

要注意的是小布条的长宽并不是固定的,可以旋转,所以剪法有两种,得出两个状态转移方程

方程1:dp[i][j] = max(dp[i][j],max((dp[i-a[k].x][j]+dp[a[k].x][j-a[k].y]),(dp[i][j-a[k].y]+dp[i-a[k].x][a[k].y]))+a[k].v);

方程2:dp[i][j] = max(dp[i][j],max((dp[i-a[k].y][j]+dp[a[k].y][j-a[k].x]),(dp[i][j-a[k].x]+dp[i-a[k].y][a[k].x]))+a[k].v);

以方程1为例要注意的是,大布条剪去小布条后剩下的布不一定是矩形,这种情况下剩下的布条可以分成两个矩形,所以总价值就是这三个矩形之和,而剩下的矩形又可以看做心的大矩形,由此循环得到max((dp[i-a[k].x][j]+dp[a[k].x][j-a[k].y]),(dp[i][j-a[k].y]+dp[i-a[k].x][a[k].y]]))+a[k].v。

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>

const int N=1010;

using namespace std;
struct piece{
    int x,y,p;
}node[N/100];

int dp[N][N];
int main(){
//    freopen("in.txt", "r", stdin);
    int cas;
    scanf("%d",&cas);
    while(cas--){
        int n,x,y;
        scanf("%d%d%d",&n,&x,&y);
        for(int i=1; i<=n; i++)
            scanf("%d%d%d",&node[i].x,&node[i].y,&node[i].p);
        memset(dp, 0, sizeof(dp));
        for(int i=0; i<=x; i++){
            for(int j=0; j<=y; j++){
                for(int k=1; k<=n; k++){
                    if(i >= node[k].x && j >= node[k].y){
                        dp[i][j] = max(dp[i][j], max(dp[node[k].x][j-node[k].y] + dp[i-node[k].x][j],dp[i-node[k].x][node[k].y]+dp[i][j-node[k].y])+node[k].p);
                    }
                    if(i >= node[k].y && j >= node[k].x){
                       dp[i][j] = max(dp[i][j], max(dp[node[k].y][j-node[k].x] + dp[i-node[k].y][j],dp[i-node[k].y][node[k].x]+dp[i][j-node[k].x])+node[k].p);
                    }
                }
            }
        }
        printf("%d\n",dp[x][y]);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值